rails 4具有嵌套属性的多个自动完成

时间:2016-04-16 09:07:28

标签: ruby ruby-on-rails-4 autocomplete nested-forms

问题 用户可以选择语言

模型 用户

      has_many :fluent_languages, foreign_key: 'user_id'
      accepts_nested_attributes_for :fluent_languages,
                                   allow_destroy: true,
                                   reject_if: proc { |attributes|     attributes['user_id'].blank? || attributes['language_id'].blank? }

FluentLanguage

  belongs_to :user
  belongs_to :language

语言

has_many :fluent_languages, foreign_key: 'language_id'

我希望选择看起来像这样  https://select2.github.io/examples.html#multiple

我的尝试:

  <%= f.fields_for :fluent_languages do |fluent_language| %>
                              <%= fluent_language.text_field :user_id, :type => 'hidden' %>
                              <%= fluent_language.autocomplete_field :language_id, autocomplete_language_language_users_path, 'data-delimiter' => ',', :multiple => true, :placeholder => 'Choose languages' %>
                              <% end %>

接下来是params的记录:

"7"=>{"user_id"=>"15", "language_id"=>["English,"]}}

但正确的数据如下所示:

"4"=>{"user_id"=>"15", "language_id"=>["1995"], "id"=>"1"}

我的代码中的另一个问题 - 对FluentLanguage中的每条记录使用自动完成渲染进行多选。另一个 - 默认数据是来自FluentLanguage的语言ID,而不是来自languages表的语言标题。

您建议针对此问题设计什么设计?

1 个答案:

答案 0 :(得分:0)

你问过几个问题,我会回答最重要的一个问题。一旦你有了一个好的数据模型,使表单能够做你想做的解决方案会更容易。

看来你在用户和语言之间有一个has_many_through关系,FluentLanguage作为直通表,需要定义。

class User
  has_many :fluent_languages
  has_many :languages, through: fluent_languages
end

class Language
  has_many :fluent_languages
  has_many :users, through: fluent_languages
end

class FluentLanguage
  belongs_to :language
  belongs_to :user
end

您需要运行迁移才能更新架构。 rails guide是has_many_through关系如何工作以及如何构建它的良好来源。 api docs也很有用。