我很确定这是一个非常的菜鸟错误,但我不明白为什么我不能直接将我的表单添加到我的主页而不会导致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
答案 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| %>