[英]Rails 4 upgrading - attr_accessor
我正在將我的應用程序從rails 3.2升級到rails 4.2.5。
在我的一個模型中,我有attr_accessor:user_id,我已經定義了一個getter和setter方法,因為我需要在條件基礎上進行值。
class DummyModel < ActiveRecord::Base
attr_accessor :user_id
belongs_to :current_user
before_save :set_user_id
def user_id
self[:user_id] ? self[:user_id] : current_user_id ? current_user.id : nil
end
def user_id=(value)
self[:user_id] = value ? value : current_user_id ? current_user.id : nil
end
private
def set_user_id
self.current_user_id = CurrentUser.first_or_create(:user_id => self[:user_id]).id
end
end
在上面的DummyModel中,該表沒有user_id。 但是需要通過我從瀏覽器獲得的params user_id更新referance current_user_id。
因此,當我執行DummyModel.new(params [:dummy_model])時,它將嘗試將params [:dummy_model] [:user_id]分配給attr_accessor(使用setter方法= user_id =(value))。 一旦分配,它可以在before_save中使用。
整個過程在導軌3.2中正常工作。 但是,當我嘗試更新到rails 4.2時,即時收到此錯誤消息,因為為self [:user_id]語法分配attr_accessor的值將被刪除。
ActiveModel::MissingAttributeError: can't write unknown attribute `user_id`
所以我有一個解決方案將user_id重命名為其他東西,但是user_id被用於我的應用程序的許多地方,它無法改變。
希望這能解釋我的問題。 我在這里先向您的幫助表示感謝。
我不確定你為什么要這樣做但是如果要替換它正在生成的方法那么使用attr_accessor沒有意義。 例如,您也可以直接使用實例變量
def user_id
@user_id || current_user_id
end
def user_id=(value)
@user_id = value || current_user_id
end
如果你更喜歡attr_accessible,你也可以在Rails 4中使用它。 你應該像gem一樣安裝它:
gem 'protected_attributes'
從上面我可以理解但是在rails 4中現在有很強的參數。 attr_accessor仍然可以在rails 4中初始化,並且仍然提供虛擬屬性,但從上面看,user_id看起來像是模型級別的物理屬性。 如果這是有道理的,請告訴我。
我認為你對rails 3 attr_accessible和attr_accessor感到困惑。
鏈接他們之間的差異: https : //stackoverflow.com/a/6958433/1306709
在rails 4中你仍然可以使用attr_accessor
,但是如果你的意思是attr_accessible
這里有一些信息: 強參數
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.