2016-04-13 3 views
0

Я использую жемчужину nested_form_fields - с привязкой options_for_select. «Выбранная опция» не сохраняется. Сама цепочка работает. Драгоценный камень написан в javascript, поэтому может возникнуть основной конфликт между жемчужиной и цепочкой jQuery. Надеюсь, однако, я упускаю из виду что-то еще.nested_form_fields gem, options_for_select with jQuery chaining not working rails

Модель - user.rb:

has_many :state_registrations, inverse_of: :user, 
    dependent: :destroy 
accepts_nested_attributes_for :state_registrations 

Модель - state_registrations.rb:

belongs_to :user, inverse_of: :state_registrations 

View - пользователи/_form.html.erb:

<div class="col-sm-12 col-md-12 form-group"> 
    <%= f.nested_fields_for :state_registrations, :html => { :multipart => true }, 
    wrapper_tag: :div do |state_registration_fields| %> 
    <div class="row" > 
    <div class="col-sm-1 col-md-1"></div> 
    <div class="col-sm-3 col-md-3"> 
     <%= state_registration_fields.label :state_license, "State" %> 
     <%= state_registration_fields.select :state_license, 
     options_for_select(@state_licenses_1), {}, {class: 
     "state_license form-control btn-default btn-block", 
     name: "state_license"} %> 
    </div> 
.... 
<div class="col-sm-3 col-md-3"> 
    <%= state_registration_fields.label :state_license_number, 
    "License Number or 'Exempt' " %> 
    <%= state_registration_fields.text_field :state_license_number, 
    class: "form-control input", type: "text", placeholder: "License 
    Number" %> 
</div> 
.... 

Javascript - custon .js: Это следует за отличной работой Мики Тууполы Chained selects plugin for jQuery and Zepto, удаленной verson.

$(document).ready(function() { 
    $(".state_license_name_user").remoteChained({ 
    parents : ".state_license", 
    url : "state_registrations/state_license_name_user", 
    loading : "Loading...", 
    clear : true 
    }); 
}); 

Controller - state_registrations_controller.rb: Это то, что прикован:

def state_license 
    @state_licenses = ['State (select)'] + StateRegistration.all.order(:state_license).pluck(:state_license).uniq 
end 

def state_license_name_user 
    state_license_name_users = StateRegistration 
    .where("state_license = ?", params[:state_license]) 
    .order(:state_license_name_user) 
    .pluck(:state_license_name_user).uniq 
    render :json => state_license_name_users.map {|value| [value, value]} 
end 

Controller - users_controller.rb:

def update 
    @user = User.includes(:state_registrations).find(params[:id]) 
raise params.inspect 

В PARAMS возвращенное показывают, что: state_license_number - который ISN 't clained - является частью хэша state_registrations. Прикован options_for_select,: state_license и: state_license_name_user (не показан на выше точки зрения), являются отдельными (в конце):

{"utf8"=>"✓", "_method"=>"patch", "authenticity_token"=>"xxxx==", 
"user"=>{"email"=>"xxx", ..., "state_registrations_attributes"=>{"0"= 
{"state_license_number"=>"OREGON-12345", "submitted_by"=>"user"}}, ..., 
"state_license"=>"Oregon", "state_license_name_user"=>"Tax Preparer", 
"commit"=>"UPDATE Profile", "controller"=>"users", "action"=>"update", 
"id"=>"1"} 

Эти три поля,: state_license,: state_license_name_user, а также: state_license_number, являются частью state_registrations. Они не включены отдельно в таблицу пользователей. Моделирование состояния и пользовательских моделей индексируются, т. Е. Таблица state_registrations имеет поле user_id, а таблица users имеет поле state_registration_id.

Я попробовал несколько обходов без успеха при сохранении: state_license и: state_license_name_user, включая использование collection_select, используя дочерний индекс каждой записи в пространство имен (хотя, откровенно говоря, я не уверен, что делал это правильно). Я думаю, мне нужно получить эту экономию, прежде чем беспокоиться о цепочке. (1) Цепочка работает, когда есть только одна запись. (2) Он разбивается на несколько записей.

Драгоценный камень nested_form_fields обеспечивает «ассоциации с именами»; однако я не понимаю предлагаемое использование [которое, тем не менее, я пробовал, после показанного примера - снова без успеха] и/или если оно применимо здесь. Nested_Form_Fields documentation

Поскольку драгоценный камень написан на javascript, использование options_for_select с цепочкой jQuery может оказаться невозможным без повторной записи кода драгоценного камня. Тем не менее, я хотел бы получить некоторые отзывы. Заранее спасибо.

+0

Глядя на ваше представление, кажется, что state_license_number не вложен внутри f.nested_fields_for: state_registrations. Но это должно быть, если это поле state_registrations. И да, сначала вы должны сделать эту работу без аддона jquery. Вы не используете ассоциацию с расширением имен, чтобы игнорировать эту часть документов. – Nico

+0

@nico Nico, спасибо, что ответили. Джастин Лав и я решили раньше сегодня днем ​​- и опубликуем ответ позже. Проблема не имела ничего общего с вашим драгоценным камнем и/или конфликтом с опциями для выбора jquery chaining. Скорее, мне нужно установить, что у многих есть ассоциация для государственных регистраций. Я непреднамеренно пытался сэкономить на мастер-таблице. – user3763682

+0

Ах, здорово, что вы это решили! – Nico

ответ

0

Дополнительные драгоценные камни и плагины скрывают реальную проблему, которая находится в схеме. state_registrations действует как основная таблица (которая будет определять доступные опции в выборе) и имеет поле user_id - дизайн не будет работать более чем для одного пользователя с заданным типом лицензии. Это действительно необходимо, чтобы таблица соединений между регистрациями и пользователями выражала отношения многих-многих.

Rails поддерживает простые много-много отношений с has_and_belongs_to_many, хотя обычно я предпочитаю явную таблицу соединений с has_many :through, поскольку она позволяет прикреплять дополнительную информацию. Пример: дата получения лицензии или последующее истечение срока действия.

Choosing Between has_many :through and has_and_belongs_to_many

Отказ от ответственности: Я встретил пользователя IRL и провел некоторое время на обсуждение схемы и намерения, чтобы понять, что происходит.