form_for неопределенный метод `model_name'для::ActiveRecord_Relation:Class

У меня были проблемы с рендерингом form_for. Я хочу иметь частичку _form.html.erb, которая занимается как созданием, так и редактированием моей записи Проблемы. Когда я иду по маршруту использования

<%= form_for(@problem) do |f| %>

Я получаю следующую ошибку:

undefined method `model_name' for Problem::ActiveRecord_Relation:Class

В моем route.rb у меня есть следующее:

PW::Application.routes.draw do
root to: 'problems#index', via: :get
resources :problems do
member do
  post 'up_vote'
  post 'down_vote'
 end
end

У меня также есть этот мой в контроллере проблем

class ProblemsController < ApplicationController
 include Concerns::Votes

 def new
  @problem = Problem.new
 end

 def index
 @problem = Problem.all
 end

 def show
 @problem = find_problem
 end

 def create
 @problem = current_user.problems.new(problem_params)
 @problem.save
 redirect_to @problem
 end


private

 def find_problem
 @problem = Problem.find(params[:id])
end

 def problem_params
params.require(:problem).permit(:name, :description, :url)
end
end

Я могу заставить его работать, если укажу следующее:

<%= form_for @problem.new, url: {action: "create"} do |f| %>

Однако я чувствую, что это повторяется, если мне нужно сделать отдельный фрагмент только для редактирования. Я действительно не могу понять, почему это не хочет работать. Может быть, я отрисовываю форму на index.html.erb?

Любая помощь или направление будет очень цениться.

4 ответа

Решение

LOL, почему я не видел это раньше?

Может быть, я отрисовываю форму на index.html.erb?

Да, это полностью проблема. Причина здесь:

Problem::ActiveRecord_Relation:Class

Вы получаете обратно relation объект (определяет коллекцию, а не одну запись). Это вызвано этим:

#controller
def index
   @problem = Problem.all
end

Ошибка из-за form_for ожидает одну запись. Вы должны использовать это в вашем контроллере, и это будет работать:

#controller
def index
   @problem = Problem.new
   @problems = Problem.all
end

#view
<%= @problems.each do |problem| %>
    <%= problem.name %>
<% end %>

<%= form_for @problem do |f| %>

Вы можете использовать @problems, как вы сказали, форма находится на главной странице. Если вы делаете это, то код действия индекса должен быть

def index
  @problems = Problem.all
  @problem = Problem.new
end

Вы должны иметь create метод, определенный в вашем контроллере, как это

def create
 @problem = Problem.new

 #other logic goes here
end

И ваш form_for за create действие должно быть таким

<%= form_for @problem, url: {action: "create"} do |f| %>

У меня была аналогичная ошибка:

      undefined method `model_name' for form_for

Это было по простой причине:

Я использовал form_for, где я должен был использовать form_with. Как только я изменил это, все заработало, как ожидалось.

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