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
. Как только я изменил это, все заработало, как ожидалось.