【问题标题】:Rendering form partials from other controllers从其他控制器渲染表单部分
【发布时间】:2011-07-15 10:15:19
【问题描述】:

我有一些可以从任何控制器渲染的共享部分,但是我在从另一个控制器渲染表单部分时遇到了一些麻烦。我希望能够为我的联系人添加备注

在我的联系人/show.html.erb 我有以下内容

<% render :partial => "notes/form", :note => Note.new %>

在我的笔记/_form.html.erb 我有以下内容

<%= form_for @note do |f| %>
  <%= render 'shared/error_messages', :object => f.object %>
  <p>
    <%= f.label :content %><br />
    <%= f.text_field :content %>
  </p>
  <p>
    <%= f.label :contact_id %><br />
    <%= f.number_field :contact_id %>
  </p>
  <p><%= f.submit %></p>
<% end %>

但是我得到了错误:

显示 /Applications/Rails/apps/saas31/app/views/notes/_form.html.erb 其中第 1 行提出:

NilClass:Class 的未定义方法 `model_name'

提取的源代码(第 1 行附近):

1: 2: f.object %>

我开始掌握 Rails 的窍门,但在学习任何新东西时遇到了一些令人沮丧的小问题。有人有什么想法吗?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1


    【解决方案1】:

    您的局部变量应该在局部哈希中传递。

    <% render :partial => "notes/form", :locals => {:note => Note.new} %>
    

    Read section 3.4.4 here.

    您的部分也不应该使用实例变量,更改以下内容:

    <%= form_for @note do |f| %>
    

    到:

    <%= form_for note do |f| %>
    

    编辑

    如果要使用实例变量,可以执行以下操作:

    <% render :partial => "notes/form", :locals => {:note => @note} %>
    

    【讨论】:

    • 是的,另外重写部分以使用'note'而不是'@note'(请记住更新任何调用部分的现有视图以使用 (:locals => ...) 形式)。
    • 感谢工作的人!唯一的问题是,现在使用该表单的 notes 控制器上的任何 CRUD 操作都不起作用,因为它们声明了一个实例变量。我是否需要重写这些操作以在渲染时显式传递节点变量?这是最佳做法吗?
    • 谢谢你,Gazler!
    【解决方案2】:

    遇到了同样的问题,这篇文章有助于解决。添加我的笔记,希望它会帮助别人:)

    当我访问 /users/new 页面时,我有一个用户控制器和一个 _form.html.erb 渲染良好。我试图将表单呈现为 /layouts/application.html.erb 的一部分,因为我想让用户能够从任何页面创建新用户。

    我最终在 application_helper.rb 中创建了一个新方法 (new_user)。这是代码:

    def new_user
      User.new    
    end
    

    然后我从 application.html.erb 渲染部分:

    <%= render :partial => 'users/form', :locals => {:user => new_user} %>
    

    【讨论】:

      猜你喜欢
      • 2011-10-09
      • 2011-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-01
      • 2013-08-18
      • 1970-01-01
      • 2012-03-02
      相关资源
      最近更新 更多