我一直遇到form_for渲染问题。我想要一个_form.html.erb部分来处理我的问题记录的创建和编辑。当我走下使用路线时
<%= form_for(@problem) do |f| %>
我收到以下错误:
undefined method `model_name' for Problem::ActiveRecord_Relation:Class
在我的routes.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上呈现表单吗?
非常感谢任何帮助或指示。
答案 0 :(得分:11)
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| %>
答案 1 :(得分:0)
您应该在控制器中定义create
方法,如此
def create
@problem = Problem.new
#other logic goes here
end
form_for
create
行动应该是这样的
<%= form_for @problem, url: {action: "create"} do |f| %>
答案 2 :(得分:0)
您可能正在使用@problems
,正如您所说,表单位于索引页面中。如果您这样做,那么索引操作代码应该像
def index
@problems = Problem.all
@problem = Problem.new
end
答案 3 :(得分:0)
我遇到了类似的错误:
undefined method `model_name' for form_for
原因很简单:
我使用了 form_for
,而我应该使用 form_with
。一旦我改变它,它就会按预期工作。