2016-04-29 83 views
3

當試圖創建一個has_one關係一個新的記錄(以及所有inverse_of正確指定)的形式被禁用:Rails的管理:HAS_ONE協會的形式打破

enter image description here

,對這個關聯的代碼如下:

class Visit < ActiveRecord::Base 
    has_one :mri, dependent: :destroy, inverse_of: :visit 

    accepts_nested_attributes_for :mri, update_only: true 
    ... 
end 

class Mri < ActiveRecord::Base 
    belongs_to :visit, inverse_of: :mri, touch: true 
    ... 
end 

我刪除與整條生產線accepts_nested_attributes,我得到一個丟失的形式,沒有什麼:

No form at all.

使用rails_admin配置禁用嵌套形式,跟隨,給出了相同的結果。

config.model Visit do 
    edit do 
    configure :mri do 
     nested_form false 
    end 
    end 
end 

回答

3

這些問題來自Rails Admin,IMO的兩個錯誤。

瞭解Rails管理員有兩種關聯形式是有用的。一個是經典的(打開創建窗口),另一個是在頁面中顯示錶單的「nested_form」。 nested_form參數可以直接更改,如上面的問題所示,但是通過Rails Admin爲accepts_nested_attributes_for中包含的關聯自動設置爲true。

第一個bugaccepts_nested_attributes_for: ..., update_only: true被rails的「解釋」爲「我不想在創建時給參數」。這種解釋似乎是wrong,因爲update_only在rails中更改的行爲僅涉及對象更新,並且不會阻止在創建時傳遞嵌套參數。此外,我會期待一個經典形式而不是完全禁用的形式。

解決此問題的一種快速且通常是有害的方法是將update_only更改爲默認false

第二個錯誤更令人驚訝,因爲'在你的臉上'。由於,has_one關係的經典(非嵌套)關聯表單如果未指定自己的id setter和getter,則無法正確初始化。因此,如果你沒有nested_attributes,你需要在你的模型行這樣:

class Visit < ActiveRecord::Base 
    has_one :mri, dependent: :destroy, inverse_of: :visit 

    def mri_id 
    self.mri.try :id 
    end 

    def mri_id=(id) 
    self.mri = Mri.find_by_id(id) 
    end 

    ... 
end 

最後,利用我們的第一個錯誤的理解給了我們最好的解決方法我最初的問題。 Rails管理模板的source code顯示Rails Admin爲字段對象的nested_form屬性存儲update_only參數。

config.model Visit do 
    edit do 
    configure :mri do 
     nested_form[:update_only] = false 
    end 
    end 
end 

PS:我們可以直接以達到所期望的行爲(這應該是海事組織默認值)進行配置這篇文章比較長,但是這個簡單的問題結束了追逐一隻兔子洞,所以我想分享我的發現 - 我希望它有幫助。非常感謝RA開發人員,他們爲Rails提供了最多功能和功能豐富的管理門戶之一(曾經)。我已經打開acouple的問題。