Неопределенный метод / NoMethodError в Rails 3 - PullRequest
0 голосов
/ 13 октября 2010

Итак, я делаю обучающее руководство по Rails на lynda.com и получаю сообщение об ошибке, которого нет в обучающем видео. Я предполагаю, что это связано с различными версиями Ruby & Rails, которые я использую (последние на сегодняшний день), в отличие от тех, которые они использовали, когда это было записано (я думаю, в 2007 году).

Вот так выглядит мой контроллер:

класс PublicController

def album_list
    @albums = Album.find_by_sql('SELECT * FROM albums;')
end 

def alt_album_list
    release_date = '2011-10-01'
    artist = 'Paul'
    @albums = Album.find(:all, 
        :conditions => ["release_date <= ? AND artist LIKE ?", release_date, '%' + artist + '%'],
        :order => 'release_date ASC',
        :limit => 1, :offset => 1)
    render(:action => 'album_list')
end

def one_album_list
    release_date = '2011-10-01'
    artist = 'Paul'
    @album = Album.find(:first, 
        :conditions => ["release_date <= ? AND artist LIKE ?", release_date, '%' + artist + '%'],
        :order => 'release_date ASC')               
end

конец

Вот как выглядит мой взгляд:

<html>
<head>
<title></title>
</head>

<body>

    Title: <%= @album.title %><br />
    Artist: <%= @album.artist %><br />
    Genre: <%= @album.genre %><br />


</body>
</html>

Ошибка, которую я получаю при загрузке:

NoMethodError in Public#show_album

Showing C:/Users/<username>/music_library/app/views/public/show_album.rhtml where line #8 raised:

undefined method `title' for nil:NilClass
Extracted source (around line #8):

5: 
6: <body>
7: 
8:  Title: <%= @album.title %><br />
9:  Artist: <%= @album.artist %><br />
10:     Genre: <%= @album.genre %><br />
11:     
Rails.root: C:/Users/<username>/music_library

Application Trace | Framework Trace | Full Trace
app/views/public/show_album.rhtml:8:in `_app_views_public_show_album_rhtml___574395264_32579964__949661750'

Ответы [ 3 ]

9 голосов
/ 13 октября 2010

Позвольте мне начать с того, чтобы сказать вам, что это ужасно устарело, если пример кода

def album_list
    @albums = Album.find_by_sql('SELECT * FROM albums;')
end

действительно в том, что видео перестает смотреть сейчас, так как оно принесет больше пользы, чем зла.на Rails есть очень современная и хорошо написанная документация на guides.rubyonrails.com , и я также слышал замечательные вещи о http://railstutorial.org/.

Теперь я попытаюсь ответить и на ваш вопрос, но поскольку этот код почти не имеет смысла, это довольно сложно.

Изменить

def album_list
    @albums = Album.find_by_sql('SELECT * FROM albums;')
end  

на

def index
    @albums = Album.all
end 

Переместите и переименуйте ваш вид в app / views / album / index.html.erb

и убедитесь, что вы изменили

  Title: <%= @album.title %><br />
  Artist: <%= @album.artist %><br />
  Genre: <%= @album.genre %><br />

на

   <% @albums.each do |album| %>
    Title: <%= album.title %><br />
    Artist: <%= album.artist %><br />
    Genre: <%= album.genre %><br />
  <% end %>

и определите маршрут в вашем файле маршрутов resources :albums

Надеюсь, это поможет вам на правильном пути к освоению Rails.

2 голосов
/ 13 октября 2010

неопределенный метод `title 'для nil: NilClass

Эта ошибка показывает, что в вашей базе данных не было найдено записей и для @album было установлено значение nil.Обязательно предоставьте некоторый защитный код, прежде чем пытаться получить доступ к свойствам объекта, извлеченного из базы данных.

0 голосов
/ 13 октября 2010

Я понял это. Я выбрал неправильное действие «show_action», когда в моем контроллере было «one_album_list».

Поэтому, когда я переименовал действие в «show_action» и перешел в url / public / show_action, оно работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...