Strong Parameter 解釋 & 一對一關聯製作


#1

這邊單純來解釋一些東西,首先,Strong Parameter的前因後果

User.create(params[:user])

如果這樣子用的話,類似使用者有 namepermission 兩個欄位,則 permission 可能會被設定到,歷史因素很多,而後來增加了 Strong Parameter 的強制白名單過濾

User.create(params.require(:user).permit(:name))

這邊是簡寫,通常會過另外的 method,不過寫起來就這樣而已,然而其實就是過個水,把原先很多的 key 過濾成剩下一個,所以你應該知道 Strong Parameter 最主要的目的是啥

User.create(:name => params[:user][:name])

結論…其實很多時候自幹還比較快|||…因為意思是完全一樣的,anyway知道前因後果,有時候拋棄反而會得到自由,繼續

如果我有個 User 有 Profile 的 1:1 關連我該怎樣新增 Profile 出來?…我直接寫最完整的 code 好了

class User < ActiveRecord::Base
  has_one :profile, :dependent => :destroy, :autosave => true
  accepts_nested_attributes_for :profile
  def initialize(*args)
    if args[0] && args[0].is_a?(Hash)
      temp_profile_attributes = args[0].delete('profile')
      super(*args)
      self.profile = Profile.new(temp_profile_attributes)
    else
      super(*args)
      self.profile = Profile.new
    end
  end
  def update_attributes(*args)
    if args[0] && args[0].is_a?(Hash) && args[0].has_key?('profile') && self.profile
      temp_profile_attributes = args[0].delete('profile')
      super(*args)
      self.profile.update_attributes(temp_profile_attributes)
    end
  end
end

大概就這樣子,其中 accepts_nested_attributes_for 的意思是巢狀 form 時會把子代也塞進去儲存,類似

http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-fields_for

fields_for 的那一段,這樣就可以把 User 和 Profile 寫在一起之類的,其餘的 initialize & update_attributes 是之前我們寫的解法就是,現在還用不用得到可以刪掉看看,以上


cheack_box_tag 陣列儲存處理
關聯資料的 update
form_for相關問題:想要把複選題改成單選題