Cat*_*ish 6 ruby ruby-on-rails ruby-on-rails-3
我有一个表单,我想要出现在每个页面的顶部,所以我将它包含在/app/views/layouts/application.html.erb文件中,我undefined method在尝试时得到错误model_name'for NilClass:Class`加载页面.
这是application.html.erb中的表单代码段
<%= form_for @user do |f| %>
<h3>Add new contact</h3>
<%= f.text_field :first_name %><br />
<%= f.text_field :last_name %>
<%= f.text_field :email %>
<hr />
<%= f.submit "Add Contact" %>
<% end %>
Run Code Online (Sandbox Code Playgroud)
这是我的/app/controllers/user_controller.rb
class UserController < ApplicationController
def index
end
def new
@user = User.new
end
end
Run Code Online (Sandbox Code Playgroud)
我想我正在遇到这个错误,因为表单在application.html.erb文件中,我需要以某种方式指定路径,但是我再次对rails很新.
如果您需要发布任何其他内容,请告诉我们.
编辑 按照Ola的建议,在我的app/views/layouts/application.html.erb文件中我有这样的东西:
<div>
<%= yield :add_user %>
</div>
Run Code Online (Sandbox Code Playgroud)
在我的app/views/users/new.html.erb文件中,我有这个
<% content_for :add_user do %>
<%= form_for @user do |f| %>
<h3>Add new contact</h3>
First Name<br />
<%= f.text_field :first_name %><br />
Last Name<br />
<%= f.text_field :last_name %><br />
Email<br />
<%= f.text_field :email %>
<hr />
<%= f.submit "Add Contact" %>
<% end %>
<% end %>
Run Code Online (Sandbox Code Playgroud)
表单未呈现,因为我的网址是http://localhost:3000/admin/index,因此它正在add_userapp/views/admin/index.html.erb中查找content_for
Dav*_* J. 13
你先尝试调试吗?我问,因为你说你是Rails的新手.如果没有,这是我的方法.我想分享它,因为我很惊讶有多少人(不管出于何种原因)仔细调试.
(我创建了一个测试应用程序,以便我可以解决您的问题.首先,我访问了http://localhost:3000/users.)
首先,查看堆栈跟踪.
用户#index中的NoMethodError
显示/Users/david/dev/testapp/app/views/layouts/application.html.erb,其中第11行引发:
用于NilClass的未定义方法`model_name':Class Extracted source(第11行附近):
8: </head>
9: <body>
10:
11: <%= form_for @user do |f| %>
12: <h3>Add new contact</h3>
13: <%= f.text_field :first_name %><br />
14: <%= f.text_field :last_name %>
Run Code Online (Sandbox Code Playgroud)
这告诉您代码中的第11行是问题所在.想想 - 可能是什么问题?路由不太可能,因为您只是呈现页面.不是语法错误,会触发另一个错误.好的,请继续阅读:
Rails.root:/ Users/david/dev/testapp
应用程序跟踪| 框架跟踪| 完整追踪
现在点击"框架跟踪",你会看到:
activemodel(3.2.6)lib/active_model/naming.rb:163:在
model_name_from_record_or_class' activemodel (3.2.6) lib/active_model/naming.rb:158:inparam_key'actionpack(3.2.6)lib/action_view/helpers/form_helper.rb:369:在`form_for'中
您可能无法理解所有这些 - 很少有人这样做 - 但您会看到错误来自model_name_from_record_or_class哪来自param_key哪来form_for.这是一个很大的线索!
我建议使用open_gemgem来轻松挖掘源代码:
gem install open_gem
Run Code Online (Sandbox Code Playgroud)
现在,看一下activemodel,因为它是堆栈跟踪中最顶层的gem:
gem open activemodel
Run Code Online (Sandbox Code Playgroud)
现在,通过启用正则表达式搜索来搜索它:
def.*model_name_from_record_or_class
(为什么?你想找到类方法 - 例如从那些开始的定义self.)
这将带你到162行naming.rb.
def self.model_name_from_record_or_class(record_or_class)
(record_or_class.is_a?(Class) ? record_or_class : convert_to_model(record_or_class).class).model_name
end
Run Code Online (Sandbox Code Playgroud)
即使不了解所有这些,它确实给出了一个很大的提示......该方法试图从记录或类中返回模型名称.为什么不能呢?因为您传递的参数@user尚未设置.未设置的实例变量的值为nil,因此在您尝试使用它之前不会抱怨.
我希望这有助于解决这个问题以及未来的问题.
Ola*_*son 12
如果包括形式为多个操作(页),你需要设置@user的东西或form_for指令将失败(这不会有什么创建形式为).
更好的方法(以及Rails默认)是为每个操作分别创建视图,每个视图仅包含该操作所需的元素,并加载到您的application.html.erb布局中<%= yield %>.因此,您将拥有一个app/views/users/new.html.erb包含该表单的视图.你永远不需要在Rails中定义任何加载路径,它们都来自模型,控制器和动作名称 - 或者来自你的routes.rb.这是约定优于配置范例的核心部分,它在Rails中运行得非常深入.
编辑:如果您确实需要在每个页面上创建一个新对象的表单(例如通常用于UserSessions),您可以重写您的表单form_for,使其不依赖于存在的对象:
form_for(User.new)
Run Code Online (Sandbox Code Playgroud)
或者如果你需要强制它发布到create方法
form_for(User.new, :url => { :action => "create" })
Run Code Online (Sandbox Code Playgroud)
您可以form_for在Ruby On Rails API文档中阅读有关资源驱动的更多信息.
这个答案实际上只是修正了Someth的答案,但解决方案是@user为每个控制器操作设置,而不仅仅是与特定控制器有关的操作.这可以通过before_filter在ApplicationController中使用a来完成,即
class ApplicationController < ActionController::Base
before_filter :initialize_user
def initialize_user
@user = User.new
end
end
Run Code Online (Sandbox Code Playgroud)
或者通过在form_for帮助器本身中创建一个新模型(注意:这在关注点分离方面很难看,但它有效......)
<%= form_for User.new do |f| %>
<h3>Add new contact</h3>
<%= f.text_field :first_name %><br />
<%= f.text_field :last_name %>
<%= f.text_field :email %>
<hr />
<%= f.submit "Add Contact" %>
<% end %>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
26578 次 |
| 最近记录: |