2013-11-27 54 views
0

我有一個Rails 4應用程序,其中型號爲ChallengeChallengeList。這是一個多對多的關係,所以我也有一個與ChallengeListsChallenge型號的連接表。我定義這最後的模型,因爲我希望我的ChallengeLists被有序列表,所以用它來開發acts_as_list以多對多關係的嵌套格式存儲訂單

class ChallengeList < ActiveRecord::Base 
    has_many :challenge_lists_challenges, :dependent => :destroy 
    has_many :challenges, :through => :challenge_lists_challenges 
    accepts_nested_attributes_for :challenges 
end 

class ChallengeListsChallenge < ActiveRecord::Base 
    default_scope :order => 'position' 
    belongs_to :challenge 
    belongs_to :challenge_list 
    acts_as_list :scope => :challenge_list 
end 

這工作得很好。


在我的HTML中,我有一個表單,允許用戶定義一個新的ChallengeList。它有Challenges嵌套形式:

= f.fields_for :challenges do |challenge_builder| 
    .field 
    = challenge_builder.text_field :description 

但我也想用戶能夠改變位置。所以,我以爲我會很聰明,添加一個字段的位置:

= challenge_builder.text_field :position 

當然,這是不行的,因爲「位置」設置上加入的項目,而不是Challenge項目。

具有ChallengeListsChallenges嵌套形式會給我訪問的位置,但不冷靜,因爲:

  1. 我需要我的ChallengeList ID的引用(這是無法逾越的,但不漂亮要麼)
  2. 我只能引用現有Challenge IDS

所以我能做些什麼?

+0

您是否試圖在相同的表單中更改挑戰和ChallengeList?是的,這會變得有點難看。也許你顯示允許使用jQuery插件在展示頁面上重新排序,並且不會在編輯頁面上重新排序。 –

+0

這就是我所追求的!我發現[這個問題](http://stackoverflow.com/questions/2182428/rails-nested-form-with-has-many-through-how-to-edit-attributes-of-join-model?rq=1 ),這看起來大概是我試圖達到的同樣的事情。所以我想試試看,並報告我的發現。 – Maarten

回答

0

this question

建立模型的依賴,像這樣:

class ChallengeList < ActiveRecord::Base 
    has_many :challenge_lists_challenges, :dependent => :destroy 
    has_many :challenges, :through => :challenge_lists_challenges 
    accepts_nested_attributes_for :challenge_lists 
end 

class ChallengeListsChallenge < ActiveRecord::Base 
    default_scope :order => 'position' 
    belongs_to :challenge 
    belongs_to :challenge_list 
    acts_as_list :scope => :challenge_list 
    accepts_nested_attributes_for :challenges 
end 

而一個雙重嵌套形式,像這樣:

= form_for @challenge_list do |f| 
    = f.fields_for :challenge_lists_challenges do |links_form| 
    .field 
     = links_form.number_field :position 
     %br/ 
    = links_form.fields_for :challenge do |challenge_form| 
     .field 
     = challenge_form.text_field :description 
    = challenge_form.text_field :id 

,它應該工作。