# <NoMethodError: неопределенный метод `any? ' для ноля: NilClass>

ruby sinatra datamapper

820 просмотра

3 ответа

13 Репутация автора

Я пытаюсь создать простое приложение, используя datamapper с несколькими моделями данных. Одно время я работал там, где у меня были родитель и дочерняя модель, которые были связаны. Однако я что-то напутал и не могу заставить работать одну из двух моих моделей. Я приведу упрощенный код, который я использую, чтобы просто попробовать и посмотреть, работает ли вторая модель (названная Songs). Трассы для модели под названием Soundtrack work.

Это моя первая публикация, поэтому извиняюсь заранее, если я недостаточно поделился. Просто дайте мне знать, и я добавлю больше.

Джон

Модель и маршруты:

require 'data_mapper'
require 'dm-timestamps'

#models

configure :development do
  DataMapper.setup(:default, "sqlite3://#{ Dir.pwd}/development.db")
end

configure :production do
  DataMapper.setup(:default, ENV['DATABASE_URL'])
end

class Soundtrack
  include DataMapper::Resource
  property :id, Serial
  property :genre, String
  property :tagline, String
  property :created_at, DateTime
  property :title, String
  property :createdby, String
end

class Songs
  include DataMapper::Resource
  property :id, Serial
  property :songtitle, String
  property :artist, String
  property :scene, String
end

DataMapper.finalize

configure :development do
  DataMapper.auto_migrate!
end



#Routes

get '/soundtrack' do
  @soundtrack = Soundtrack.all
  slim :soundtrack
end

get '/singletrack' do
  @songs = Songs.all
  slim :singletrack
end


get '/soundtrack/new' do
  @soundtrack = Soundtrack.new
  slim :new_soundtrack
end

get '/soundtrack/:id' do
  @soundtrack = Soundtrack.get(params[:id])
  slim :show_soundtrack
end

get '/soundtrack/:id/edit' do
  @soundtrack = Soundtrack.get(params[:id])
  slim :edit_soundtrack
end

post '/soundtrack' do
  @soundtrack = Soundtrack.create(params[:soundtrack])
  redirect to("/soundtrack/#{@soundtrack.id}")
end

post '/soundtrack/:id' do
   @soundtrack = Soundtrack.get(params[:id]).songinfo.create params['songinfo']
   redirect back
end

post '/songs/:id' do
   @songs = Songs.create(params[:songs])
   redirect back
end

put '/soundtrack/:id' do
    soundtrack = Soundtrack.get(params[:id])
    soundtrack.update(params[:soundtrack])
    redirect to('/soundtrack/[:id]')
end

delete '/soundtrack/:id' do
    Soundtrack.get(params[:id]).destroy
    redirect to('/soundtrack')
end

delete '/songinfo/:id' do
    Songinfo.get(params[:id]).destroy
    redirect back
end 

HTML (тонкий):

.frame
  .row
    <div class="table-responsive">
      <table class="table">
        thead.background-black
          <tr>
            th.text-title Song
            th.text-title Artist
            th.text-title Scene

          </tr>
        </thead>
        <tbody>
           - if @songs.any?
            tr#songs
              -@songs.each do |songs|
                tr
                  th #{songs.songtitle}
                  th #{soundtrack.artist}
                  th #{soundtrack.scene}
                </tr>
           - else
             tr
               th  No songs have been created yet!
        </tbody>
      </table>
    </div>


    .col-md-2
.col-md-10
  pre.pre-black

    row
      form-horizontal
        form-group
           col-sm-2
             label for="Song Title"
               p.text-title.form-lower Soundtrack Title
             col-sm-2
               input.form-control type="string" name="songs[songtitle]" value="#{@songs.songtitle}"

    row
      form-horizontal
        form-group
          col-sm-2
            label for="Song Artist"
             p.text-title.form-lower Song Artist
            col-sm-10
            input.form-control type="string" name="songs[artist]" value="#{@songs.artist}"


    row
      form-horizontal
        form-group
          col-sm-2
            label for="Scene"
              p.text-title.form-lower Scene in Moveie
          col-sm-10
            input.form-control type="string" name="songs[scene]" value="#{@songs.scene}"

    .col-md-6
      h3.bump class==current?("/songs") Add A New Song
      .form method="POST" action="/songs"
        input.lower.link-size type="submit" class="text-center" value="Save Song"

Gem File:

source :rubygems
gem "sinatra"
gem "slim"
gem "data_mapper"
gem "dm-timestamps"
gem "thin"
gem "dm-postgres-adapter", :group => :production
gem "dm-sqlite-adapter", :group => :development
gem 'pg', '~> 0.18.4'
Автор: Jon Poehlman Источник Размещён: 18.07.2016 02:12

Ответы (3)


1 плюс

875 Репутация автора

Решение

Мне кажется, что у тебя нет песен. Вы не можете вызвать .any?ноль, что приводит к этой ошибке. Убедитесь, что у вас есть песни и попробуйте снова.

И чтобы избежать этой ошибки в случае наличия nil, используйте !@songs.to_s.empty?или убедитесь, что он возвращает [] вместо nil

Автор: Maxim Fedotov Размещён: 18.07.2016 02:20

0 плюса

1702 Репутация автора

Максим прав.

Вы можете сделать его путь или:

Объедините проверку:

if @songs && @songs.any?

Инициализируйте @songs в вызове контроллера, так что это не ноль, а пустой массив:

@songs = []
Автор: fabriciofreitag Размещён: 18.07.2016 02:34

1 плюс

424 Репутация автора

Проверьте используя

@songs.present?

Чтобы узнать больше о any?, present?, empty?, blank?смотреть по этой ссылке .

Автор: Nishant Kumar Размещён: 05.07.2017 07:53
Вопросы из категории :
32x32