Rails 3 渲染 / 部分视图

3
我很新于Rails 3,并且已经跟随一些教程,现在我正在尝试“玩”创建的代码。 我已经按照http://guides.rubyonrails.org/getting_started.html中的教程进行了操作。
我正在尝试使用以下代码在主页上呈现新帖子的表单:
<%= render :partial => "posts/form" %>

posts/_form.html.erb的内容如下:

<%= form_for(@post) do |f| %>
  <% if @post.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@post.errors.count, "error") %> prohibited this post from being saved:</h2>

      <ul>
      <% @post.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= f.label :name %><br />
    <%= f.text_field :name %>
  </div>
  <div class="field">
    <%= f.label :title %><br />
    <%= f.text_field :title %>
  </div>
  <div class="field">
    <%= f.label :content %><br />
    <%= f.text_area :content %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

这是我收到的错误信息:

 undefined method `model_name' for NilClass:Class
Extracted source (around line #1):

1: <%= form_for(@post) do |f| %>
2:   <% if @post.errors.any? %>
3:     <div id="error_explanation">
4:       <h2><%= pluralize(@post.errors.count, "error") %> prohibited this post from being saved:</h2>
Trace of template inclusion: app/views/home/index.html.erb

Rails.root: d:/server/cazare

Application Trace | Framework Trace | Full Trace
app/views/posts/_form.html.erb:1:in `_app_views_posts__form_html_erb___794893824_70478136_519766'
app/views/home/index.html.erb:5:in `_app_views_home_index_html_erb__967672939_70487520_0'

我知道这对你们中的一些人来说可能很简单,但我正在尝试理解Rails上的所有内容,所以希望你们能理解我。

提前感谢!


你是否遇到了错误或者有什么问题? - Wukerplank
你所贴出的代码中并没有那段代码(调用 model_name)。你需要查看错误信息,它应该会给出文件名和行号,然后贴出那一部分代码,并告诉我们具体发生在哪一行。 - Andrew Marshall
我已经更新了帖子并修正了错误。很抱歉一开始没有发布。 - Alex Panait
我在原始文本中发布了完整的错误消息,并且我也搜索了model_name,但我的代码中没有任何地方出现... - Alex Panait
@thekindofme,model_name是一个已经被弃用的Rails函数http://apidock.com/rails/ActiveSupport/CoreExtensions/Module/model_name。 - Vasiliy Ermolovich
显示剩余2条评论
3个回答

5

@post变量在控制器中没有实例化 :)

因此,在控制器操作中使用"@post = Post.new"即可解决问题


1
Rails 正在尝试为对象 @post 构建一个表单。为了做到这一点,它需要知道 @post 是什么样的对象;这样,它就可以找到对象中的任何现有数据,并将其填充到表单中。Rails 有一个称为 model_name 的方法来执行查找,但它不会被嵌入到 NilClass(即 nil 对象的类)中。
我怀疑您没有在任何地方定义 @post - 它是控制器的实例变量,因此您期望控制器从数据库中找到 @post,或者调用 @post = Post.new - 因此它是 nil

我终于弄清楚了,虽然我现在不知道事情是如何运作的,但你是对的,我没有在我的home#index控制器中定义@post。 - Alex Panait

0

在 posts/_form.html.erb 文件中,

请修改

 <%= form_for(@post) do |f| %>

<%= form_for(Post.new) do |f| %>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接