当我尝试添加表单时,FrontPages #home中的NoMethodError

时间:2014-06-06 23:36:57

标签: ruby-on-rails ruby simple-form

我很确定这是一个非常的菜鸟错误,但我不明白为什么我不能直接将我的表单添加到我的主页而不会导致NoMethodError。

这是我目前的设置,它完全正常。

view / front_pages / home.html.erb(我的主页)

<!--declare :title to be SHOULD I GET THIS-->
<% provide(:title, "SHOULD I GET THIS") %>
<div class = "container">
    <h1>Should I really spend money on this?</h1>
    <h2>Let's crunch in some numbers and find out...</h2>
    <%= link_to "Get Started", calculate_path, class: "btn btn-info " %>
</div>

view / users / new.html.erb(我的表单现在在哪里)

<% provide(:title, "Calculate")%>
<div class = "form-group container">
    <%= simple_form_for @user do |form|%>
        <%= form.error_notification%>
        <%= form.input :price%>
        <%= form.input :wallet%>
        <%= form.button :submit, "Submit", class: "submit"%>
    <%end%>
</div>

控制器/ users_controller.rb

class UsersController < ApplicationController
    def new
        @user = User.new
    end

end

但是,我希望表单直接在我的主页上,这样用户就不需要点击额外的按钮来访问表单。我试过了

查看/ front_pages / home.html.erb

<!--declare :title to be SHOULD I GET THIS-->
<% provide(:title, "SHOULD I GET THIS") %>
<div class = "container">
    <h1>Should I really spend money on this?</h1>
    <h2>Let's crunch in some numbers and find out...</h2>
    <%= link_to "Get Started", calculate_path, class: "btn btn-info " %>
</div>
<div class = "form-group container">
    <%= simple_form_for @user do |form|%>
        <%= form.error_notification%>
        <%= form.input :price%>
        <%= form.input :wallet%>
        <%= form.button :submit, "Submit", class: "submit"%>
    <%end%>
</div>

然后它返回NoMethodError。我以为是因为我没有在front_page控制器中启动@user变量,所以我尝试了

class FrontPagesController < ApplicationController
        def new
            @user = User.new
        end
    def home
    end
end

但它仍然无效。我正在考虑关于MVC的一些概念,我仍然不太了解。我的代码有什么问题,下次我应该记住什么,所以我不会犯同样的错误?

PS:我使用simple_form gem来生成我的表单

编辑:错误消息是未定义的方法`model_name&#39;对于NilClass:Class

2 个答案:

答案 0 :(得分:2)

错误很简单:

  

未定义的方法`model_name&#39;对于NilClass:Class

此错误表示您尝试在未填充任何数据的变量上调用model_name方法。 没有调用此方法; form_for是 - 意味着您基本上需要在控制器中声明@user,正如您正确指出的那样:

class FrontPagesController < ApplicationController

    def new
        @user = User.new
    end
    def home
    end
 end

-

<强> @user

问题是您正在使用home操作 - 您在@user操作中声明了new变量。这意味着它不会被设置,因为它不会被调用。

你最好这样做:

class FrontPagesController < ApplicationController
    def home
       @user = User.new
    end
 end

这会使@user行动中出现home,这可以为您解决错误!

答案 1 :(得分:-1)

您需要为表单

指定操作
<%= form_for :user, url: { action: create } do |f| %>

如果您为用户

定义了资源,则可以使用路径助手
<%= form_for :user, url: user_path do |f| %>