fields_for с mongoid embeds_many вложенных документов - PullRequest
1 голос
/ 09 декабря 2011

пытается использовать этот Railscast в качестве руководства: http://railscasts.com/episodes/197-nested-model-form-part-2?view=asciicast

и работает с этой ошибкой:

`@search[queries_attributes][new_queries][queries' is not allowed as an instance variable name

Модель:

#search.rb
class Search
  include Mongoid::Document
  include Mongoid::Timestamps


  belongs_to :user
  field :name,              :type => String

  embeds_many :queries
  accepts_nested_attributes_for :queries, :reject_if => lambda { |a| a[:content].blank? }, :allow_destroy => true

#query.rb
class Query
  include Mongoid::Document

  field :columns,           :type => String
  field :types,             :type => String
  field :keywords,          :type => String

  embedded_in :search, :inverse_of => :queries 

end

поиск контроллера:

def new
  @search = Search.new
  @search.queries.build
  #3.times { @search.queries.build }
end

_form.html.haml частично:

= form_for(@search) do |f|
  = f.label 'Name this search'
  = f.text_field :name, :class => 'text_field'
  = render :partial => 'query', :collection => @search.queries, :locals => { :f => f }
  = link_to_add_fields "Add Query", f, :queries 

  .actions
    = f.submit

_query.html.haml, часть:

.fields
  = f.fields_for "queries[]", query do |q|

    = q.label 'Search Datatype'
    = q.select :types, Query::TYPES

    = q.label 'In Column'
    = q.select :columns, @search.record_columns

    = q.label 'For Keywords:'
    = q.text_field :keywords, :class => 'text_field'

    = q.hidden_field :_destroy 
    = link_to_function "remove", "remove_fields(this)" 

Поиск помощника:

module SearchesHelper

    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 , :f => builder)
      end
      link_to_function(name, h("add_fields(this, \"#{association}\", \"#{escape_javascript(fields)}\")"))
    end

end

JavaScript:

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));
}

при строке:

= link_to_add_fields "Add Query", f, :queries

закомментировано, работает как положено, но мне нужно иметь возможность добавлять дополнительные запросы через этого помощника. для тестирования нескольких запросов я запускаю создание в контроллере 3.times

также в сообщении об ошибке последний "]" удаляется .. не уверен, что мне не хватает

извините за все теги, но не уверен, где проблема

Ответы [ 2 ]

2 голосов
/ 14 декабря 2011

похоже, что это было исправлением:

= f.fields_for :queries, query do |q|
1 голос
/ 09 декабря 2011

Две мысли:

Я бы назвал класс Query как-то иначе, он, вероятно, конфликтует с некоторыми вещами внутри mongoid согласно указанному вами сообщению об ошибке:

@search[queries_attributes][new_queries][queries' is not allowed as an instance variable name]

Также погуглил твою проблему, я наткнулся на это:

http://www.jtanium.com/2009/11/03/rails-fields_for-is-not-allowed-as-an-instance-variable-name/

Что-то должно быть ноль, где не должно быть.

...