Rails 4升级

我将我的应用程序从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 method = user_id =(value))。 一旦分配它可以在before_save中使用。

整个事情在rails 3.2中正常工作。 但是当我试图更新到rails 4.2时,我得到这个错误消息,因为为attr_accessor赋值self [:user_id]语法被删除。

    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'

我可以从上面了解到,但在轨道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这里有一些信息:强大的参数

链接地址: http://www.djcxy.com/p/25791.html

上一篇: Rails 4 upgrading

下一篇: What's the nature of "property" in a Ruby class?