Как правильно обновить логическое поле, используя 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,

Другие вопросы по тегам