Получение неопределенного метода `klass 'для nil: nilclass - Railscast # 197 - PullRequest
2 голосов
/ 19 ноября 2011

Привет всем, я следил за Railscasts Райана Бейтса на вложенных моделях и формах, но я получаю неопределенный метод `klass 'для nil: nilclass. Я уверен, что это связано с полями 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));  
}

Ответы [ 2 ]

2 голосов
/ 20 июля 2013

Я обнаружил, что помощник link_to_add_fields не будет работать, если связанная модель описывается has_one.Has_one означает, что ассоциация не получает объект klass.

Вы можете определить, что это ваша проблема, изменив отношение к has_many: object + s (имя вашего объекта с s) и передав ваш объект во множественном числеlink_to_add_fields.

1 голос
/ 07 декабря 2011

Вы сделали то же самое, что и этот человек здесь

Редактировать: (ошибка с моей стороны)

Я предполагаю, что у вас есть link_to_add_fields ниже этой строки

<%= link_to_remove_fields "Remove", f %>

, поскольку кажется, что _restaurant_fields.html.erb неполный. (без закрывающего тега)

</p>

Удалить поля link_to_add_fields вне поля f.fields_for

Это должно решить ошибку класса.

...