0

所以我在通过表单为我的 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

着装形象模型

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 的新手,所以我可能会遗漏一些完全明显的东西或者做错了。

4

2 回答 2

0

这是一个解决方案。为每个嵌套字段组添加隐藏输入。使用 aradio_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") )

您可能需要稍微修改代码,因为它只是一个未经测试的快速示例,但它应该给您一个想法。

于 2013-10-11T08:27:44.363 回答
0

所以我最终使用了这种方法:<%= dress_image_form.radio_button :is_primary, true %>并在单击一个单选按钮时使用 jquery 取消选择所有其他单选按钮。对我来说,这似乎是一种 hacky 方法——必须有一种纯粹的 Rails 方式来做到这一点,而不必求助于 JS?在找到更好的解决方案之前,我将坚持使用此解决方案。

于 2013-10-11T23:28:00.437 回答