小编Sam*_*mes的帖子

为什么私有setter的行为与其他私有方法不同?

这是一个我无法解释的有趣案例.私人制定者看起来像'私人',但有时也有例外.常规私有方法似乎与私有setter的行为不同:

class TestClass
  def do
    self.foo = :bar # fine
    self.baz        # error
  end

  private

  def foo=(other)
    @foo = other
  end

  def baz
  end
end

TestClass.new.do
Run Code Online (Sandbox Code Playgroud)

上面的代码设置@foo得很好,尽管被明确调用self.然后它无法调用#baz,因为它#baz是一个私有方法.

怎么了?

ruby

7
推荐指数
1
解决办法
165
查看次数

简单的Rails数组未保存到数组列

我正在使用Rails 4.1.0,Ruby 2.1.0和Postgres 9.3.0.0。

我试图将更改保存到一个列,该列是一个hstores数组(用ruby的话来说是一个哈希数组)。

这是产品模型中的(简化)代码,用于保存更改:

def add_to_cart_with_credits(cart)
    cart.added_product_hashes << {"id" => self.id.to_s, "method" => "credits"}
    # For some reason, this isn't saving (without the exclamation, as well)
    cart.save!
end
Run Code Online (Sandbox Code Playgroud)

注意事项:

  1. 购物车在added_product_hashes列中使用空数组初始化
  2. 我将添加的产品存储为哈希,因为有两种方法可以将产品添加到购物车中,并且每种方法都需要使用自己的逻辑来删除和自定义。
  3. 每个用户都有自己的购物车,以后需要引用它,这就是为什么购物车以这种方式保存到数据库的原因(我猜不是使用会话变量)。

有什么想法我做错了吗?我没有看到错误:服务器日志显示该cart.added_product_hashes列已正确更新,但更改不会持久。

正如James指出的那样,<<因为它可以就地编辑数组,所以不要将记录标记为脏记录。虽然我并没有在数组列中更改hstore本身,但是除非明确地重构了属性,否则似乎不会对封闭的数组进行更改。以下代码解决了该问题:

def add_to_cart_with_credits(cart)
    cart.added_product_hashes = cart.added_product_hashes + [{"id" => self.id.to_s, "method" => "credits"}]
    # Now we're all good to go!
    cart.save!
end
Run Code Online (Sandbox Code Playgroud)

詹姆斯还提出了一种更简洁的方法。

ruby postgresql ruby-on-rails hstore

2
推荐指数
1
解决办法
1409
查看次数

为什么Ruby中存在全局变量?

我已经阅读关于全局变量的C2Wiki,我有三个关于它们的问题(在这篇文章的底部).主要问题是:如果全局变量如此糟糕,为什么Ruby会有它们?

此外,我注意到一些关于Ruby中全局变量的有趣行为,这使得它们与常规全局级常量的工作方式不同.

1.引用未定义的全局变量返回nil.引用未定义的全局常量返回NameError:

2.2.3 :001 > $THING
 => nil 
2.2.3 :002 > THING
NameError: uninitialized constant THING
    from (irb):2
    from /Users/makerslaptop82/.rvm/rubies/ruby-2.2.3/bin/irb:15:in `<main>'
Run Code Online (Sandbox Code Playgroud)

2. irb用两者初始化$stdoutSTDOUT定义.您可以重新定义$stdout,这不会影响STDOUT:

2.2.3 :001 > $stdout
 => #<IO:<STDOUT>> 
2.2.3 :002 > STDOUT
 => #<IO:<STDOUT>> 
2.2.3 :003 > $stdout = IO.new(6)
 => #<IO:fd 6> 
2.2.3 :004 > $stdout
 => #<IO:fd 6> 
2.2.3 :005 > STDOUT
 => #<IO:<STDOUT>> 
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  • 如果全局变量如此糟糕,为什么Ruby会拥有它们?
  • 为什么引用未定义的全局变量 …

ruby global global-variables

0
推荐指数
1
解决办法
748
查看次数