我正在使用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可能是不可行的。但是,我想得到一些反馈。提前谢谢。
答案 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,并花了一些时间讨论模式和意图,了解发生了什么。