小编Ste*_*fan的帖子

如何检查内存中记录的数据库更改?

我想检查一个ActiveRecord实例是否在数据库方面被更改.就像是:

p1 = Product.first
p1.name #=> "some name"

p2 = Product.first
p2.name = "other name"
p2.save #=> true

p1.database_changed? #=> true
Run Code Online (Sandbox Code Playgroud)

我目前正在将记录的属性与持久化属性进行比较:

class Product < ActiveRecord::Base

  def database_changed?
    Product.find(id).attributes != attributes
  end

end
Run Code Online (Sandbox Code Playgroud)

这似乎有效,但我想知道是否有内置的方法来查找数据库更改?

ruby-on-rails

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

安装pry后找不到命令

我在bash提示符中使用以下行安装了pry和相关的gem:

gem install pry-plus --no-ri --no-rdoc
Run Code Online (Sandbox Code Playgroud)

该命令报告了成功的gem安装.

我发现的所有说明都说安装pry之后我可以通过输入prybash命令来获得pry提示符.但是,实际结果是bash: pry: command not found

which pry报告no pry in (...)省略号为$ PATH的位置.相比之下,which rake报告/local/tbh/rbenv/shims/rakewhich gem报告/local/tbh/rbenv/shims/gem

为什么pry的命令不是由gem install创建的?我怎样才能让它按设计工作?

(我在Scientific Linux下使用Ruby 1.9.3和rbenv(不是RVM)作为虚拟环境.)

ruby rubygems pry rbenv

6
推荐指数
1
解决办法
1864
查看次数

ruby/rails数组两个索引之间的所有元素

我有这样一个数组: [7, 8, 9, 10, 11, 12, 1, 2, 3, 4, 5, 6]

从数组6到0返回数组中每个项的最简单方法是什么,结果数组如下所示: [1,2,3,4,5,6,7]

数组中的这个位置可以是动态的,例如传入4和9应该返回 [11,12,1,2,3,4]

我想知道是否有一种方法可以在Rails api中实现这一点.

提前致谢

编辑让我们假设没有负数,所以做array[2..-2]不行.

Array#splice几乎适用于此,但如果第二个位置小于第一个位置,则返回nil.

ruby arrays ruby-on-rails

6
推荐指数
1
解决办法
577
查看次数

如何在Ruby中获取Enumerable的第n个元素

例如,要返回我可以写的第10,000个素数:

require 'prime'
Prime.first(10000).last #=> 104729
Run Code Online (Sandbox Code Playgroud)

但是创建一个巨大的中间数组,只是为了检索它的最后一个元素感觉有点麻烦.

鉴于Ruby是如此优雅的语言,我会期待如下:

Prime.at(9999) #=> 104729
Run Code Online (Sandbox Code Playgroud)

但没有Enumerable#at.

以上解决方法是否有意或是否有更直接的方法来获取第n个元素Enumerable

ruby

6
推荐指数
2
解决办法
1264
查看次数

动态添加的实例方法无法访问类变量

(问题已在Ruby论坛发布,但没有引起任何答案).

这是我的代码:

class MC
  def initialize
    @x = 5
    @@y = 6
  end

  def f
    puts @x
    puts @@y
  end
end

m = MC.new
m.f
Run Code Online (Sandbox Code Playgroud)

m.f 产生预期的输出而没有错误:

5
6
Run Code Online (Sandbox Code Playgroud)

但是这个:

def m.g
  puts @x
  puts @@y
end

m.g
Run Code Online (Sandbox Code Playgroud)

生产:

5
warning: class variable access from toplevel
NameError: uninitialized class variable @@y in Object
Run Code Online (Sandbox Code Playgroud)

为什么我能访问@@yf,但不从g

在警告和错误信息的提及中toplevel,Object对我来说是令人费解的.

@x印刷为5,所以它的环境是MC.这排除的可能性,@x@@y在定义m.g指的是顶层环境(Object …

ruby

6
推荐指数
2
解决办法
116
查看次数

Ruby的块语法如何工作?

我是Ruby的新手,并尝试理解这种语法:

create_table :posts do |t|
  t.string :title
  t.string :content
  t.string :likes
  t.string :comments

  t.timestamps null: false
end
Run Code Online (Sandbox Code Playgroud)

我完全理解什么这段代码是干什么的,但我不明白如何它的工作原理.更具体地说,我理解这create_table是一个方法,并且:posts是一个参数,但我不理解其余的代码.

ruby ruby-on-rails

6
推荐指数
2
解决办法
158
查看次数

如何在Ruby中找到方法的嵌套?

在Ruby中,常量查找受嵌套影响,方法保留其嵌套.

例如,如果我有这些模块:

module A
  X = 1
end

module B
  X = 2
end

module Foo
end
Run Code Online (Sandbox Code Playgroud)

我可以定义Foo.a一个嵌套的方法[A, Foo]:

module Foo
  module ::A
    Module.nesting #=> [A, Foo]
    def Foo.a
      X
    end
  end
end

Foo.a #=> 1
Run Code Online (Sandbox Code Playgroud)

以及Foo.b嵌套的方法[Foo, B]:

module B
  module ::Foo
    Module.nesting #=> [Foo, B]
    def Foo.b
      X
    end
  end
end

Foo.b #=> 2
Run Code Online (Sandbox Code Playgroud)

如果我定义Foo::X:差异变得明显:

Foo::X = 3

Foo.a #=> 1  <- still resolves to A::X
Foo.b #=> 3 …
Run Code Online (Sandbox Code Playgroud)

ruby reflection nested constants

6
推荐指数
1
解决办法
191
查看次数

在红宝石和其他编程语言中,西里尔字符串Я̆Я̄Я̈返回长度2而不是1

在Ruby,Javascript和Java(其他我没试过)中,有西里尔字符Я̆Я̄Я̈长度2.当我尝试用这些字符检查字符串的长度时,我的输出值很差.

"??".mb_chars.length
#=> 2  #should be 1 (ruby on rails)

"??".length
#=> 2  #should be 1 (ruby, javascript)

"?".length
#=> 1  #correct (ruby, javascript)
Run Code Online (Sandbox Code Playgroud)

请注意,字符串以UTF-8编码,每个字符串都表现为单个字符.

我的问题是为什么会有这样的行为,如何在这些字符内正确获取字符串的长度?

ruby string ruby-on-rails utf-8 unicode-normalization

6
推荐指数
2
解决办法
123
查看次数

法拉第宝石未定义方法 'bytesize'=' for Hash`

我想向 API 发送 POST 请求。这是我的代码:

conn = Faraday.new(url: BASE) do |faraday|
  faraday.response :logger
  faraday.request  :url_encoded
  faraday.headers['Content-Type'] = 'application/json'
  faraday.headers["Authorization"] = "bearer #{AppConfig.instance.access_token}"
  faraday.adapter Faraday.default_adapter
end
form_data = {a: 1, b: 2}
conn.post("/api/test", form_data)
Run Code Online (Sandbox Code Playgroud)

但我收到这个错误:

conn = Faraday.new(url: BASE) do |faraday|
  faraday.response :logger
  faraday.request  :url_encoded
  faraday.headers['Content-Type'] = 'application/json'
  faraday.headers["Authorization"] = "bearer #{AppConfig.instance.access_token}"
  faraday.adapter Faraday.default_adapter
end
form_data = {a: 1, b: 2}
conn.post("/api/test", form_data)
Run Code Online (Sandbox Code Playgroud)

我也尝试过:

conn.post("/api/test", form_data.to_json)
Run Code Online (Sandbox Code Playgroud)

但它也不起作用。

ruby ruby-on-rails faraday ruby-on-rails-4

6
推荐指数
1
解决办法
6063
查看次数

键:值与键:红宝石中的值?

在关联中,我们通常这样做a :bbelongs_to :something)。当我们使用符号键创建哈希时,通常会这样做a: b。话虽如此,我的问题是两种语法之间的区别是什么。还有什么逻辑可以记住何时使用哪种约定?

ruby symbols

6
推荐指数
1
解决办法
71
查看次数