所以我在通过表单为Dress对象设置主图像时遇到问题。 表单允许用户编辑着装详细信息,然后向表单添加/删除图像(使用nested_form),并为每个表单设置标签并指定主图像。
除了通过单选按钮设置主图像外,所有功能都可以使用。
着装模特:
class Dress < ActiveRecord::Base
has_many :dress_images
has_one :primary_dress_image, :class_name => "DressImage", :conditions => { :is_primary => true }
accepts_nested_attributes_for :dress_images, :allow_destroy => true
validates :name, :presence => true, :length => { :maximum => 99 }
end
DressImage模型
class DressImage < ActiveRecord::Base
belongs_to :dress
# Same as:
# def self.primary
# where(:is_primary => true)
# end
scope :primary, where(:is_primary => true)
# clear old primary if:
# this is a new record
# this is existing and is_primary has been set to true
before_save :clear_primary,
:if => Proc.new{ |r| (r.new_record? && r.is_primary) || (r.is_primary_changed? && r.is_primary) }
validates :label, :presence => true, :length => { :maximum => 60 }
validates :caption, :length => { :maximum => 200 }
mount_uploader :image, ImageUploader
def clear_primary
DressImage.update_all( {:is_primary => false}, :dress_id => self.dress_id )
end
end
着装编辑表格
<h1>Dress</h1>
<% @dress.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %> <%#= f.label :name %>
<%= nested_form_for @dress, :as => :dress, :url => { :action => :update }, :html=>{ :multipart => true } do |f| %>
<%= f.label :name %>
<%= f.text_field :name %>
<%= f.label :description %>
<%= f.text_area :description %>
<%= f.fields_for :dress_images do |dress_image_form| %>
<div class="dress-image">
<%= image_tag dress_image_form.object.image_url(:thumb) %>
<%= dress_image_form.text_field :label %>
<%= dress_image_form.file_field :image %>
<div class="primary-image-radio">
<%= dress_image_form.label :is_primary, "Main Image" %>
<%= f.radio_button :primary_dress_image_id, dress_image_form.object.id %>
</div>
<p>
<%= dress_image_form.link_to_remove "Remove this attachment" %>
</p>
</div>
<% end %>
<%= f.link_to_add "Add Photo", :dress_images %>
<%= f.submit "Save Dress" %>
<% end %>
使用此单选按钮,将在Dress对象上设置primary_dress_image_id属性,但@ dress.primary_dress_image会为ID提供不同的结果。
如果我将单选按钮更改为<%= dress_image_form.radio_button :is_primary, true %>
它会更好,但由于每个单选按钮的名称不同,所以它们不会被视为同一组。
我是rails的新手,所以我可能会遗漏一些完全明显或完全没错的东西。
答案 0 :(得分:0)
这是一个解决方案。
为每个嵌套字段组添加隐藏输入。使用radio_button_tag
代替radio_button
来确保它们位于同一组中:
<div class="dress-image">
<%= dress_image_form.hidden_field :is_primary, :class => 'primary-image' %>
...
<%= radio_button_tag "select_primary_image", true, dress_image_form.object.is_primary? %>
...
</div>
然后根据单选按钮选择添加一些javascript来更新隐藏字段:
$("body").on "change", ".primary-image-radio input:radio" ->
$(@).closest(".dress-image").find(".primary-image").val( $(@).is(":checked") )
您可能需要稍微修改一下代码,因为它只是一个未经测试的快速示例,但它应该会给您一个想法。
答案 1 :(得分:0)
所以我最终使用了这个方法:<%= dress_image_form.radio_button :is_primary, true %>
并使用jquery取消选中所有其他单选按钮。
对我来说,这似乎是一种hacky方法 - 必须有一个纯粹的Rails方式来做到这一点,而不必诉诸JS?在找到更好的解决方案之前,我会坚持使用这个解决方案。