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中,table没有user_id。但是参考 current_user_id 需要通过我从浏览器获得的参数 user_id 进行更新。

所以当我执行 DummyModel.new(params[:dummy_model]) 时,它会尝试将 params[:dummy_model][:user_id] 分配给attr_accessor(使用 setter 方法 = user_id=(值))。一旦分配,它就可以在 before_save.

中使用

这一切在 rails 3.2 中运行正常。但是当我尝试更新到 rails 4.2 时,我收到此错误消息,因为使用 self[:user_id] 语法为 attr_accessor 分配值已被删除。

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

所以我有一个解决方案可以将 user_id 重命名为其他名称,但是 user_id 在我的应用程序的许多地方使用,无法更改。

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

如果您喜欢 attr_accessible,您也可以在 Rails 4 中使用它。你应该像 gem:

这样安装
gem 'protected_attributes'

我从上面可以理解但在 rails 4 中现在有强大的参数。 attr_accessor 仍然可以在 rails 4 中初始化并且仍然为您提供虚拟属性,但是从上面看起来 user_id 是模型级别的物理属性。让我知道这是否有意义。

我认为你对 rails 3 attr_accessible and attr_accessor 感到困惑。

Link关于它们的区别:

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

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

def user_id
  @user_id || current_user_id
end

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