Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.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 3 从rails setter访问属性_Ruby On Rails 3 - Fatal编程技术网

Ruby on rails 3 从rails setter访问属性

Ruby on rails 3 从rails setter访问属性,ruby-on-rails-3,Ruby On Rails 3,我在尝试从Rails中的自定义setter访问(读取)属性时遇到了困难: def password=(new_password) puts self.firstname # returns nil # Do other checks here before setting a hashed SCrypt password end firstname是在(user)对象上定义的,但是调用firstname不会产生值集。我需要从自定义setter中读取各种属性,以便根据firstna

我在尝试从Rails中的自定义setter访问(读取)属性时遇到了困难:

def password=(new_password)

  puts self.firstname # returns nil

  # Do other checks here before setting a hashed SCrypt password

end

firstname是在(user)对象上定义的,但是调用firstname不会产生值集。我需要从自定义setter中读取各种属性,以便根据firstname、lastname和电子邮件地址进行密码检查。

您有相应的getter方法吗

def password
  @password
end
或者如果它是一个非常简单的getter/setter对

:attr_accessor password
更新您的评论:那么您想做些什么,而不仅仅是在setter中设置属性

所以很明显,我不得不建议不要这样做。但是,您可以执行以下操作:

def password=(new_password)
  some_method(new_password)
  @password = new_password
end
这将把新的_password方法从setter中传递出去,允许您在将实例变量设置为新值之前使用它做其他事情

如果您试图访问密码设置器中的firstname属性,如您的示例所示,您可以通过以下方式进行访问:

def password=(new_password)
  some_method(firstname)
  @password = new_password
end  

您没有使用self调用getter方法。

确定似乎是我的应用程序的一个问题。我刚刚做了一个运行良好的最小测试应用程序:

class User < ActiveRecord::Base

  def password
    password ||= SCrypt::Password.new(password_hash)
  end

  def password=(new_password)

    logger.info 'DEBUG: self.lastname: ' + self.lastname.to_s

    self.password_hash = SCrypt::Password.create(new_password, :key_len => 512, :salt_size => 32)

  end

end
Loading development environment (Rails 3.2.12)
2.0.0-p0 :001 > u = User.new
 => #<User id: nil, firstname: nil, lastname: nil, password_hash: nil, created_at: nil, updated_at: nil>
2.0.0-p0 :002 > u.lastname = "Some Lastname"
 => "Some Lastname"
2.0.0-p0 :003 > u.password = 'test'
DEBUG: self.lastname: Some Lastname
 => "test"
class用户512,:salt\u size=>32)
结束
结束
在控制台中,它可以正常工作:

class User < ActiveRecord::Base

  def password
    password ||= SCrypt::Password.new(password_hash)
  end

  def password=(new_password)

    logger.info 'DEBUG: self.lastname: ' + self.lastname.to_s

    self.password_hash = SCrypt::Password.create(new_password, :key_len => 512, :salt_size => 32)

  end

end
Loading development environment (Rails 3.2.12)
2.0.0-p0 :001 > u = User.new
 => #<User id: nil, firstname: nil, lastname: nil, password_hash: nil, created_at: nil, updated_at: nil>
2.0.0-p0 :002 > u.lastname = "Some Lastname"
 => "Some Lastname"
2.0.0-p0 :003 > u.password = 'test'
DEBUG: self.lastname: Some Lastname
 => "test"
加载开发环境(Rails 3.2.12)
2.0.0-p0:001>u=User.new
=> #
2.0.0-p0:002>u.lastname=“一些lastname”
=>“某个姓氏”
2.0.0-p0:003>u.password='test'
调试:self.lastname:Some lastname
=>“测试”

因此,这似乎是与应用程序中的gem/something/某处相关的问题,而不是Rails特有的问题。向列表致歉。

根据我的观察,参数的顺序在这里很重要

⚠️ 注意传递时
:firstname
:password
的顺序

如果您正在使用
参数require(:user).permit(:firstname,:password)
,然后通过
.new
=setter
方法将其传递给您的setter。然后,您可以始终在
password=
setter方法中访问
self.firstname
,因为您首先设置了
firstname
,可以为下一个setter访问它


但是,如果您有
params.require(:user).permit(:password,:firstname)
,则您的密码设置程序方法无法访问
self.firstname

这可能不是您希望的答案,但我会选择a)像auth gem一样的用户或b)复制auth策略。我个人会做设计,但这两种方法都非常耗时。遗憾的是,设计对我们来说不是一种选择。然后我会尝试复制迈克尔·哈特尔的技术。你能发布一个链接到他的页面的相关页面/部分吗?也不是一个直接的回答:设计的一个很好的替代方法是。是的,我有一个getter方法。我要寻找的是一种从密码的setter方法中访问user.firstname属性的方法。很抱歉,它似乎不起作用。我无法访问setter方法中的firstname变量,因此也无法将其传递给某个_方法。您需要发布用户字段设置位置的代码,因为它是在黑暗中拍摄的,无法看到。你可以发布这个类,这样我们就可以看到它的样子,因为答案中的代码是正确的。我假设这个password=method在User类中……你需要发布上下文才能看到发生了什么。