【发布时间】:2018-04-13 11:13:20
【问题描述】:
我正在使用Cocoon gem 构建一个嵌套表单,其中一个 field_for 包含另一个 field_for。层次结构如下所示: - 信函形式 -Card field_for -Button field_for
我有一个link_to_add_association,以便通过按钮动态添加卡片。这部分看起来像这样:
<div class="connected-carousels">
<div class="stage">
<div class="carousel carousel-stage">
<ul id="carousel-stage-ul">
<%= f.fields_for :cards do |card_fields| %>
<% if @blabla %>
<%= render 'card_fields', f: card_fields %>
<% end %>
<% end %>
<% end %>
</ul>
</div>
<a href="#" class="prev prev-stage"><span>‹</span></a>
<a href="#" class="next next-stage"><span>›</span></a>
</div>
<div class="navigation">
<a href="#" class="prev prev-navigation">‹</a>
<a href="#" class="next next-navigation">›</a>
<div class="carousel carousel-navigation">
<ul id="carousel-navigation-ul"></ul>
</div>
</div>
<div>
<%= link_to_add_association '+ Add Card', f, :cards, id: 'add-card-button-bis', data: { association_insertion_node: '#carousel-stage-ul', association_insertion_method: :append } %>
</div>
</div>
_card_fields.html.erb 部分渲染按钮:
<% f.object.buttons.build %>
<%= f.fields_for :buttons do |button_card_fields| %>
<%= render 'button_fields', f: button_card_fields %>
<% end %>
_button_fields.html.erb 部分:
<div class="add-button-card-modal">
<h4>Add New Button</h4>
<label>Button Text</label>
<%= f.text_field :button_text, :maxlength => 20, placeholder: "Enter the text to display on the button..." %>
<br><br>
<label>Button URL</label>
<%= f.text_field :button_url, placeholder: "Paste URL..." %>
<div class="nav-popups-buttons">
<button type="button" id="validate_new_card_button" class="small-cta2">Add Button</button>
<p class="remove-link" id="delete_new_card_button">Remove Button</p>
</div>
</div>
字母模型:
class Letter < ApplicationRecord
validates :campaign_name, :presence => true
belongs_to :core_bot
has_many :messages, dependent: :destroy
has_many :cards, dependent: :destroy
has_many :filters, dependent: :destroy
has_many :analytic_deliveries, dependent: :destroy
has_many :analytic_reads, dependent: :destroy
has_many :analytic_sends, dependent: :destroy
accepts_nested_attributes_for :filters, allow_destroy: true, :reject_if => :all_blank
accepts_nested_attributes_for :messages, allow_destroy: true, :reject_if => :all_blank
accepts_nested_attributes_for :cards, allow_destroy: true, :reject_if => :all_blank
end
卡片型号:
class Card < ApplicationRecord
validates :remote_image_url, :format => URI::regexp(%w(http https)), presence: { message: '%{value} : please enter valid url' }, :allow_blank => true
validates :title, :subtitle, :presence => true
belongs_to :letter, optional: true
has_many :buttons, dependent: :destroy
accepts_nested_attributes_for :buttons, :reject_if => Proc.new { |att| att[:button_text].blank? && att[:button_url].blank? }, allow_destroy: true
end
按钮型号:
class Button < ApplicationRecord
validates :button_url, :format => URI::regexp(%w(http https)), presence: { message: '%{value} : please enter valid url' },
unless: Proc.new { |a| a.button_url.blank? }
validates :button_text, :presence => true, unless: Proc.new { |a| a.button_url.blank? }
belongs_to :message, optional: true
belongs_to :card, optional: true
has_one :short_url, dependent: :destroy
end
在出现错误时在信控制器中创建操作:
@letter.filters.build
if params[:letter]['cards_attributes'].present? == false
@letter.cards.build.buttons.build
end
format.html { render :new }
format.json { render json: @letter.errors, status: :unprocessable_entity }
问题在于,当创建操作引发错误或我编辑记录时,按钮未构建。如果我将@letter.cards.build.buttons.build 添加到控制器中,它会添加一张新卡,但按钮输入仍然没有出现。
更新 事实上按钮是内置的。唯一的问题是我用来显示显示按钮字段的弹出窗口的自定义 jquery 无法正常工作,因为它们是在 cocoon:after-insert 回调中创建的。
当出现错误或在编辑视图上时,我创建的卡片会被渲染,而不是由 link_to_add_association 添加。这个 cocoon:after-insert 回调没有被调用...
知道如何使用 link_to_add_association 的相同逻辑在渲染的卡片字段上调用插入后回调吗?
【问题讨论】:
-
Button_fields、card_field_partial是实际文件名还是您有正确的 Rails 名称而只是忘记包含它们? -
另外,您是否删除了围绕初始
<%= render 'card_fields', f: card_fields %>的 IF 语句?您是否设置了测试以确保在表单引发的故障期间 if 语句正确触发? -
我用文件名编辑了问题。实际上我以为我需要渲染,但似乎不需要,因为我在其中动态添加了所有字段...
-
这可能是多余的......但你应该只需要一个
.build......它建立了整个关系向后工作......@letter.cards.build.buttons.build,试试@letter.cards.buttons.build -
是的,我就是这么做的,问题解决了!
标签: ruby-on-rails forms cocoon-gem