获取未定义的方法“klass”对于 nil:nilclass - Railscast #197

发布于 2024-12-16 22:05:51 字数 2540 浏览 5 评论 0原文

大家好,我遵循 Ryan Bates 关于嵌套模型和表单的 Railscasts,但是我得到了 nil:nilclass 的未定义方法“klass”。我很确定这是由于 link_to_add_fields 造成的,因为之前一切都正常。下面是我的错误和其他相关代码,我正在使用 Rails 3.1。我做了很多谷歌搜索,但没有找到任何可以解决我的问题的方法,所以如果你们能帮助我,我将非常感激。感谢您的帮助。

_form.html.erb

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

      <ul>
      <% @organization.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 id="restaurant_field" class="field">
        <%= f.fields_for :restaurants do |builder| %>
            <%= render 'organizations/partials/restaurant_fields', :f => builder %>
        <% end %>
    </div>

  <div class="actions"><%= f.submit %></div>
<% end %>

_restaurant_fields.html.erb

<p class="fields">
<%= f.label :name, "Restaurant Name" %><br />
<%= f.text_field :name %>
<%= link_to_remove_fields "Remove", f %>

application_helper.rb

    module ApplicationHelper
  def link_to_remove_fields(name, f)
      f.hidden_field(:_destroy) + link_to_function(name, "remove_fields(this)")
    end

    def link_to_add_fields(name, f, association)
      new_object = f.object.class.reflect_on_association(association).klass.new
      fields = f.fields_for(association, new_object, :child_index => "new_#{association}") do |builder|
        render(association.to_s.singularize + "_fields", :f => builder)
      end
      link_to_function(name, h("add_fields(this, \"#{association}\", \"#{escape_javascript(fields)}\")"))
    end
end

application.js

function remove_fields(link) {  
    $(link).prev("input[type=hidden]").val("1");  
    $(link).closest(".fields").hide();  
}  

function add_fields(link, association, content) {  
    var new_id = new Date().getTime();  
    var regexp = new RegExp("new_" + association, "g");  
    $(link).parent().before(content.replace(regexp, new_id));  
}

Hi all I followed Ryan Bates' railscasts on nested models and form, but I am getting getting undefined method `klass' for nil:nilclass. I am pretty sure it is due to the the link_to_add_fields since everything was working prior. Below is my error and other relevant code and I'm using Rails 3.1. I did a lot of googling and did not find any to solve my problem, so if you guys could help me out I would really appreciated it. Thanks for your help.

_form.html.erb

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

      <ul>
      <% @organization.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 id="restaurant_field" class="field">
        <%= f.fields_for :restaurants do |builder| %>
            <%= render 'organizations/partials/restaurant_fields', :f => builder %>
        <% end %>
    </div>

  <div class="actions"><%= f.submit %></div>
<% end %>

_restaurant_fields.html.erb

<p class="fields">
<%= f.label :name, "Restaurant Name" %><br />
<%= f.text_field :name %>
<%= link_to_remove_fields "Remove", f %>

application_helper.rb

    module ApplicationHelper
  def link_to_remove_fields(name, f)
      f.hidden_field(:_destroy) + link_to_function(name, "remove_fields(this)")
    end

    def link_to_add_fields(name, f, association)
      new_object = f.object.class.reflect_on_association(association).klass.new
      fields = f.fields_for(association, new_object, :child_index => "new_#{association}") do |builder|
        render(association.to_s.singularize + "_fields", :f => builder)
      end
      link_to_function(name, h("add_fields(this, \"#{association}\", \"#{escape_javascript(fields)}\")"))
    end
end

application.js

function remove_fields(link) {  
    $(link).prev("input[type=hidden]").val("1");  
    $(link).closest(".fields").hide();  
}  

function add_fields(link, association, content) {  
    var new_id = new Date().getTime();  
    var regexp = new RegExp("new_" + association, "g");  
    $(link).parent().before(content.replace(regexp, new_id));  
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

小嗲 2024-12-23 22:05:51

我发现如果关联模型由 has_one 描述,则 link_to_add_fields 助手将无法工作。 has_one 表示关联未获取 klass 对象。

您可以通过将关系更改为 has_many :object + s (带有 s 的对象名称)并将复数对象传递给 link_to_add_fields 来确定这是您的问题。

I found that the link_to_add_fields helper won't work if the associated model is describe by a has_one. The has_one means the association does not get the klass object.

You can determine this is your problem by changing your relationship to has_many :object + s (your object name with an s) and passing your object in plural to link_to_add_fields.

赢得她心 2024-12-23 22:05:51

您在此处

编辑:(我的错误)

我假设您在该行下方有一个 link_to_add_fields

<%= link_to_remove_fields "Remove", f %>

,因为似乎 _restaurant_fields.html.erb 部分不完整。 (没有结束标记)

</p>

删除 f.fields_for 之外的 link_to_add_fields

这应该可以解决 klass 错误。

You have done the same thing as this person here

Edit: (error on my part)

I am assuming you have an link_to_add_fields below this line

<%= link_to_remove_fields "Remove", f %>

as it seems that the _restaurant_fields.html.erb partial is incomplete. (no closing tag)

</p>

Remove the link_to_add_fields outside of the f.fields_for

That should solve the klass error.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文