jQuery TokenInput插件,在编辑时具有深度nested_attributes预填充令牌



我在我的应用程序上有以下结构。

class Foo < ActiveRecord::Base
  has_many :examples, :dependent => :destroy
  accepts_nested_attributes_for :examples
end
class Example < ActiveRecord::Base
  belongs_to :foo
  has_many :codes, :dependent => :destroy
  accepts_nested_attributes_for :codes, :reject_if => lambda { |a| a[:code].blank? }
end
class Code < ActiveRecord::Base
  belongs_to :example
  has_many :code_kinds
  has_many :kinds, :through => :code_kinds
  attr_reader :kind_tokens
  def kind_tokens=(ids)
    self.kind_ids = ids.split(",")
  end
end
class CodeKind < ActiveRecord::Base
  belongs_to :code
  belongs_to :kind
end
class Kind < ActiveRecord::Base
    has_many :code_kinds
    has_many :codes, :through => :code_kinds   
end

它非常适合具有创建和保存fields_for的表单。

我正在使用 RailsCast #258 令牌字段中描述的kind_tokens

但是在编辑表单上,现在一切都完美显示,我应该在嵌套属性内的kind_tokens字段中预填充data-pre属性中的数据,以便在examplescode

RailsCast说:

<%= f.text_field :author_tokens, "data-pre" => @book.authors.map(&:attributes).to_json %>

但我不能做@foo.examples.codes.kinds.map...,因为与Fooexamples的关系返回一个集合,与codes的情况相同。

我只是使用:

<%= f.fields_for :codes do |codes_form| %>

那是在里面

<%= f.fields_for :examples do |examples_form| %>

现在,如果我没有任何循环,并且一切都由nested_attributesfields_for完成,我如何预填充代码的类型?

已解决

每次使用

<%= f.fields_for ...

Rails 会自动发出loop,因此您可以在那里安装某种计数器,例如:

<%
@ctrEx = 0
@ctrCd = 0
%>
<%= form_for @foo ...
    <%= f.fields_for :examples do |examples_form| %>
        ...
        <%= examples_form.fields_for :codes do |codes_form| %>
            ...
            <%= codes_form.text_field :kind_tokens, :class => "tag_matcher", "data-pre" => @foo.examples[@ctrEx].codes[@ctrCd].kinds.map(&:attributes).to_json %>
            ...
            <%@ctrCd +=1%>
        <%end%>
        ...
        <%
        @ctrEx += 1
        @ctrCd = 0
        %>
    <%end%>
<%end%>

现在,您可以在data-pre中使用计数器,如下所示:

@foo.examples[@ctrEx].codes[@ctrCd].kinds.map(&:attributes).to_json

这就是我想通的方法,但一定有另一种方法。

最新更新