簡體   English   中英

Rails 4升級 - attr_accessor

[英]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_accessibleattr_accessor感到困惑。

鏈接他們之間的差異: https//stackoverflow.com/a/6958433/1306709

在rails 4中你仍然可以使用attr_accessor ,但是如果你的意思是attr_accessible這里有一些信息: 強參數

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM