2013-10-11 75 views
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 

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 %> 

利用該單選按鈕,則primary_dress_image_id屬性被設置在裙對象上,但@ dress.primary_dress_image給ID提供了不同的結果。

如果我將單選按鈕更改爲<%= dress_image_form.radio_button :is_primary, true %>它可以更好地工作,但由於每個單選按鈕的名稱不同,它們不會被視爲同一組。

我是新來的鐵軌,所以我可能會錯過一些完全明顯的東西或做錯了所有事情。

回答

0

所以我結束了使用這種方法:<%= dress_image_form.radio_button :is_primary, true %>和使用jquery取消選擇所有其他單選按鈕時單擊。 對我來說,這看起來像是一種詭計多端的方法 - 必須有一種純粹的Rails方式來做到這一點,而不必訴諸JS?直到我找到一個更好的,我會堅持這個解決方案。

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")) 

您可能需要稍微修改代碼,因爲它只是一個未經測試的快速示例,但它應該給你一個想法。