私は最近これに噛まれました、そしてこれを起こさせるために何が起こっているのかを正確に知ることは役に立つでしょう、それで他の人はこの間違いを避けます。
次のようなスキーマを持つモデルUserがあります。
create_table "users", :force => true do |t|
t.string "user_name"
t.string "first_name"
t.string "last_name"
t.string "email"
t.string "location"
t.string "town"
t.string "country"
t.string "postcode"
t.boolean "newsletter"
クラスuser.rbには、次の3つのメソッド用のattr_accessorがあります。
class User < ActiveRecord::Base
# lots of code
attr_protected :admin, :active
# relevant accessor methods
attr_accessor :town, :postcode, :country
end
次の方法がある場合、ユーザーコントローラーで次のようになります。
def create
@user = User.new params[:user]
end
このparamsハッシュの内容で新しいユーザーを作成しようとすると:
--- !map:HashWithIndifferentAccess
# other values
country: United Kingdom
dob(1i): "1985"
dob(2i): "9"
dob(3i): "19"
town: london
country
返されるオブジェクトには、のように、town
および郵便番号のpostcode
値に空の文字列が含まれています。
(rdb:53) y user1
--- !ruby/object:User
attributes:
# lots of attributes that aren't relevant for this example, and are filled in okay
postcode:
country:
town:
attr_accessorメソッドがActiveRecordの既存のアクセサーメソッドを覆い隠していることがわかります。なぜなら、それらを取り出すとすべて正常に機能するため、解決策はかなり簡単です。それらを取り出すだけです。
しかし、ここで何が起こっているのでしょうか?
私はここActiveRecordのRailsAPIドキュメントとRuby自身のドキュメントattr_accessor
を探していますが、ここでどのように問題が発生しているかについてはまだ少しぼんやりしてattr_accessor
います。
他の貧しい魂がこれに反するのを防ぐために光を当てることができる人はいますか?