Rails 4升级 - attr_accessor

时间:2016-02-20 09:13:14

标签: ruby-on-rails ruby-on-rails-4 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中使用。

这一切都在rails 3.2中正常工作。但是,当我尝试更新到rails 4.2时,我收到此错误消息,因为为自动[:user_id]语法分配attr_accessor的值将被删除。

    ActiveModel::MissingAttributeError: can't write unknown attribute `user_id`

所以我有一个解决方案将user_id重命名为其他东西,但是user_id被用于我的应用程序的许多地方,它无法改变。

希望这能解释我的问题。感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

我不确定你为什么这样做但是如果要替换它正在生成的方法,使用attr_accessor是没有意义的。您也可以直接使用实例变量,例如

def user_id
  @user_id || current_user_id
end

def user_id=(value)
  @user_id = value || current_user_id
end

答案 1 :(得分:1)

如果你更喜欢attr_accessible,你也可以在Rails 4中使用它。你应该像gem一样安装它:

gem 'protected_attributes'

从上面我可以理解但是在rails 4中现在有很强的参数。 attr_accessor仍然可以在rails 4中初始化,并且仍然提供虚拟属性,但从上面看,user_id看起来像是模型级别的物理属性。如果这是有道理的,请告诉我。

答案 2 :(得分:0)

我认为您对rails 3 attr_accessibleattr_accessor感到困惑。

关于它们之间差异的链接:https://stackoverflow.com/a/6958433/1306709

在rails 4中,您仍然可以使用attr_accessor,但如果您想attr_accessible这里有一些信息:strong parameters