【问题标题】:Why is this instance variable being assigned为什么要分配此实例变量
【发布时间】:2015-06-29 04:24:14
【问题描述】:

我正在阅读一篇关于 ruby​​ 服务对象的文章: http://code.tutsplus.com/tutorials/service-objects-with-rails-using-aldous--cms-23689

我不明白为什么要为 @user_data_hash 赋值。它没有在代码中的任何地方使用。我在我读过的其他文章中看到很少有其他例子做同样的事情。分配给这个实例变量有什么需要?

class CreateUserService < Aldous::Service
  attr_reader :user_data_hash

  def initialize(user_data_hash)
    @user_data_hash = user_data_hash
  end

  def default_result_data
    {user: nil}
  end

  def perform
    user = User.new(user_data_hash)

    if user.save
      Result::Success.new(user: user)
    else
      Result::Failure.new
    end
  end
end

【问题讨论】:

  • 不用过多阅读文档,看起来这只是用户登录时可能从 cookie 中传入的数据示例。

标签: ruby-on-rails ruby


【解决方案1】:

@user_data_hash 被使用,因为

attr_reader :user_data_hash

是一个宏:

def user_data_hash
  @user_data_hash
end

这意味着:perform 方法中的这一行user = User.new(user_data_hash) 将读取分配给@user_data_hash 的哈希:

【讨论】:

  • 啊,这很有道理。不需要在 ruby​​ 中使用 user_data_hash 作为参数的括号让我感到困惑。我在想正确的写法是 User.new(@user_data_hash)。
  • 最好不要直接调用实例变量,而是通过getter。这使得以后重构更容易。所以User.new(@user_data_hash)不是正确的方式,而是另一种方式。
【解决方案2】:

attr_reader 定义了一个名为user_data_hash 的方法,它返回@user_data_hash。因此,每当您致电user_data_hash 时都会使用它。

【讨论】:

    猜你喜欢
    • 2012-10-11
    • 2013-03-21
    • 2018-03-01
    • 2018-02-05
    • 2016-02-10
    • 1970-01-01
    • 1970-01-01
    • 2017-03-18
    • 1970-01-01
    相关资源
    最近更新 更多