attr_accessible 的 roles 功能

在撰寫 attr_accessible 的時候其實我們可以透過 as 指定不一樣的權限身份來進行這些fields的assign限制,譬如說:

class User < ActiveRecord::Base
  # Columns:
  #   username
  #   password
  #   admin

  attr_accessible :username, :password
  attr_accessible :username, :password, :admin, as: :admin
end

在user.rb中我們有三個欄位分別是username, password跟admin,然後只有admin這個role可以設定某筆Record是否可以直接透過parameters的方式來assign給User,所以:

u = User.new
user_params = { username: 'hechien', password: 'passpass', admin: true }
u.assign_attributes(user_params)
u.username #=> "hechien"
u.admin #=> nil

值得先提的是,在沒有指定任何role的時候有一個名稱叫做:default,就是給這種設定的預設值。

看到上面的code,我們可以發現雖然我們一開始有把admin設定為true,但是在透過:default給值的時候因為它只允許username與password通過而已,所以admin會沒有被設定。

在這個時候我們就必須用這種方式來處理:

u = User.new
user_params = { username: 'hechien', password: 'passpass', admin: true }
u.assign_attributes(user_params, as: :admin)
u.username #=> "hechien"
u.admin #=> true

看到在assign_attributes的第二個參數了嗎?這個參數說明了要透過:admin這個role來執行這個assign (或者new / save / update),這個時候設定admin的值就成功通過了。

Comments

comments powered by Disqus