Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails 4升级-属性访问器_Ruby On Rails_Ruby On Rails 4_Attr Accessor - Fatal编程技术网

Ruby on rails Rails 4升级-属性访问器

Ruby on rails Rails 4升级-属性访问器,ruby-on-rails,ruby-on-rails-4,attr-accessor,Ruby On Rails,Ruby On Rails 4,Attr Accessor,我正在将我的应用程序从rails 3.2升级到rails 4.2.5 在我的一个模型中,我有一个attr_访问器:user_id,我定义了一个getter和setter方法,因为我需要在条件basic上赋值 class DummyModel < ActiveRecord::Base attr_accessor :user_id belongs_to :current_user before_save :set_user_id

我正在将我的应用程序从rails 3.2升级到rails 4.2.5

在我的一个模型中,我有一个attr_访问器:user_id,我定义了一个getter和setter方法,因为我需要在条件basic上赋值

    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
因此,我有一个解决方案可以将user\u id重命名为其他名称,但是user\u id在我的应用程序的许多地方都被使用,这是不可能更改的


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

如果您喜欢attr\u accessible,您也可以在Rails 4中使用它。您应该像gem一样安装它:

gem 'protected_attributes'

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

我想你对和感到困惑

关于它们之间区别的链接:


在rails 4中,您仍然可以使用
attr\u accessor
,但是如果您的意思是
attr\u accessor
,那么这里有一些信息:

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

def user_id
  @user_id || current_user_id
end

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

谢谢你的回复。我也尝试过使用受保护的属性。我的问题是使用self[:user\u id]而不是self.user\u id。我不能使用self.user\u id,因为它会引发堆栈级的深度错误。你能告诉我错误并在该范围内尝试过,还有什么模型名称会有用。你能用所有
attr\u accessible
attr\u accessor
,显示你的完整模型吗,关联和getter/setter定义?我认为@FrederickCheung下面的答案是正确的。
def user_id
  @user_id || current_user_id
end

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