Как правильно обновить логическое поле, используя link_to. Получение неопределенного метода `model_name'для TrueClass:Class
У меня есть ниже link_to
в цикле в моем приложении рельсы
<%= link_to 'Up', Product.find(n.id).update_attribute(:opinion, true)%>
Но я не могу его обновить. Потому что это дает мне ошибку
undefined method `model_name' for TrueClass:Class
Итак, мне интересно в этом случае, как правильно обновить булево поле?
2 ответа
Вы не обновляете мнение после нажатия на ссылку, вы обновляете его, когда страница отображается.
Допустим, на вашей странице есть только следующий код:
<%= link_to 'Up', Product.find(n.id).update_attribute(:opinion, true)%>
Что действительно происходит, когда вы попадаете на эту страницу, так это то, что код <%= %>
выполняется и используется для генерации строки, которая станет вашим HTML. Таким образом, упрощая ваше выражение, на одном шаге выполнения у вас будет следующий код:
<%= link_to 'Up', true %>
И это сгенерирует HTML
<a href="true">Up</a>
Что не то, что вы намерены.
Решение
Создайте действие на контроллере продукта, который получает идентификатор продукта, обновляет продукт и перенаправляет обратно. Итак, как то так:
На вашем route.rb
resource :products do
member do
post 'update_opinion'
end
end
На вашем products_controller.rb:
def update_opinion
Product.find(params[:id]).update_attribute(:opinion, true)
redirect_to :back
end
На ваш взгляд:
<%= link_to 'up', update_opinion_project_path(n) %>
Ваш код сильно отличается от того, что вы, похоже, преследуете.
Вспомогательный метод link_to принимает два параметра: текст ссылки и цель ссылки, которые могут быть:
- строка, как:
'http://stackru.com'
; - хеш, ссылающийся на все отдельные компоненты внутреннего URL, как определено маршрутами;
- объект или массив объектов.
В качестве второго параметра вы передаете выражение:
Product.find(n.id).update_attribute(:opinion, true)
который оценивается при первом запуске кода, то есть во время рендеринга. Выражение пытается обновить атрибут немедленно, а затем возвращает логическое значение, которое сообщает, успешно ли выполнена операция: true, если оно успешно обновило атрибут, в противном случае - false.
В вашем случае это выглядит успешно: он возвращает true
,
Сейчас, true
не является ни строкой, ни хэшем, поэтому он рассматривается как объект, класс которого TrueClass
, Таким образом, он рассматривает его как модель, но не как модель, он не определяет методы моделей; при этом ошибка.
То, что вы хотите сделать, это поместить код в контроллер и поместить URL относительно правильного действия контроллера в качестве второго параметра link_to
,