Неопределенный метод в ruby ​​on rails

Я новичок в Ruby on Rails, и я застрял на чем-то таком простом, но я просто не могу понять это.

Я создал модель видео, контроллер и представление, а затем создал контроллер приветствия для домашней страницы.

Я вручную создал файл index.html.erb в папке приветствия и перенаправил домашнюю страницу на Welcome#index. Все работает нормально на данный момент.

Дело в том, что когда я определяю метод в welcome_controller вот так

def foo
   puts 'Hello'
end

и я вызываю его в файле welcome/index.html следующим образом

<%= foo %>

Я получаю следующую ошибку: неопределенная локальная переменная или метод `foo' для #‹#:0x39675d8>


person user3099920    schedule 13.12.2013    source источник


Ответы (2)


Действия контроллера не являются помощниками представления, вам нужно поместить foo либо в application_helper.rb, либо в welcome_helper.rb, чтобы использовать его так, как вы, и изменить его на удалить puts, например:

def foo
  'Hello'
end

Это добавит Hello в ваше представление (чего, я думаю, вы и ожидали)

Основываясь на ваших комментариях ниже, вы, вероятно, должны использовать scope в своей модели...

scope :highlighted -> { (where(highlight: true) }

... чтобы вернуть выделенные записи с вашего контроллера...

@highlighted = Videos.highlighted

... а затем перебрать @highlighted в вашем представлении...

<% @highlighted.each do |video| %>
<%= ...do something with video here... %>
<% end %>

подробнее обо всем этом читайте здесь:

http://guides.rubyonrails.org/index.html

и специально для прицелов здесь...

http://guides.rubyonrails.org/active_record_querying.html

person Donovan    schedule 13.12.2013
comment
То, что я пытаюсь сделать, это вызвать этот метод module WelcomeHelper def search_highlight @highlighted = Videos.where(highlight: true) puts @highlighted end end, но теперь я получаю неинициализированную постоянную ошибку. Я попытался просто вывести приветствие, и ошибка undefined methor исчезла, но приветствие не выводится на экран. - person user3099920; 13.12.2013
comment
не используйте puts... вы хотите, чтобы метод возвращал строку (или другой объект), а не отправлял ее в STDOUT. - person Donovan; 13.12.2013

Вы не можете вызывать произвольные «вещи» в контроллере.

В контроллере отображаются его переменные экземпляра, например, @foo.

Если вы действительно хотите вызвать метод, использующий puts, поместите его во вспомогательную функцию, например, welcome_helper.rb (или любое другое соглашение).

Обратите внимание, однако, что это не сделает то, что вы, кажется, считаете, а именно, поместит «Привет» на веб-страницу. Вы в основном пишете прямо в консоль, даже не в файл журнала.

Чего конкретно вы пытаетесь достичь?

person Dave Newton    schedule 13.12.2013
comment
То, что я пытаюсь сделать, это вызвать этот метод module WelcomeHelper def search_highlight @highlighted = Videos.where(highlight: true) puts @highlighted end end, но теперь я получаю неинициализированную постоянную ошибку. Я попытался просто вывести приветствие, и ошибка undefined methor исчезла, но приветствие не выводится на экран. - person user3099920; 13.12.2013
comment
@user3099920 user3099920 Потому что puts не имеет ничего общего с рендерингом HTML, как я уже сказал. Помощники предназначены для возврата строк HTML. Вы перебираете видео и возвращаете строку HTML для коллекции. Я не стал бы, я бы использовал партиал. - person Dave Newton; 13.12.2013