nested_form_fields gem,options_for_select with jQuery chaining not working rails

时间:2016-04-13 01:19:28

标签: ruby-on-rails nested-forms

我正在使用nested_form_fields gem - 使用链接的options_for_select。选择的选项'没有储蓄。链接本身正在发挥作用。 gem是用javascript编写的,因此gem和jQuery链接之间可能存在基本冲突。但是,希望我能忽略别的东西。

模型 - 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

查看 - users / _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: 这是继Mika Tuupola Chained selects plugin for jQuery and Zepto(远程版)的出色工作之后。

$(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

返回的参数显示:state_license_number - 未链接 - 是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表的一部分。它们不会单独包含在users表中。 state_registration和用户模型被索引,即state_registrations表具有user_id字段,users表具有state_registration_id字段。

我尝试了一些没有成功保存的解决办法:state_license和:state_license_name_user,包括使用collection_select,使用每个记录的子索引到命名空间(尽管,坦率地说,我不确定我是否正确地执行了此操作) 。我想我需要在担心链接之前得到这个节省。 (1)当只有一条记录时,链接起作用。 (2)它打破了多个记录。

nested_form_fields gem确实提供了命名空间关联&#39 ;;但是,我不理解建议的用法[尽管如此,我尝试过,按照显示的例子 - 再次没有成功]和/或如果它适用于此。 Nested_Form_Fields documentation

因为gem是用javascript编写的,所以如果没有重写gem代码,使用带有jQuery链接的options_for_select可能是不可行的。但是,我想得到一些反馈。提前谢谢。

1 个答案:

答案 0 :(得分:0)

额外的宝石和插件掩盖了架构设计中的真正问题。 state_registrations充当主表(将在select中定义可用选项)并具有user_id字段 - 该设计不适用于具有给定许可类型的多个用户。它确实需要注册和用户之间的连接表来表达许多关系。

Rails支持与has_and_belongs_to_many的简单多个关系,尽管我通常更喜欢使用has_many :through的显式连接表,因为它允许附加其他信息。示例:获取许可证的日期或下次到期。

Choosing Between has_many :through and has_and_belongs_to_many

免责声明:我遇到了用户IRL,并花了一些时间讨论模式和意图,了解发生了什么。