form_for undefined方法`model_name' for :: ActiveRecord_Relation:Class

时间:2014-04-28 08:50:27

标签: ruby-on-rails routes form-for

我一直遇到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上呈现表单吗?

非常感谢任何帮助或指示。

4 个答案:

答案 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。一旦我改变它,它就会按预期工作。