小编Mic*_*dah的帖子

对"respond_to?"感到困惑 方法

编辑:我使用的是Ruby 2.0.0版

我在文件example.rb中有以下代码

def say_hello
  puts 'hi'
end

puts respond_to?(:say_hello)
say_hello
Run Code Online (Sandbox Code Playgroud)

运行此代码时,输​​出为:

false
hi
Run Code Online (Sandbox Code Playgroud)

我很困惑为什么为"respond_to"返回false?当我可以使用那种方法.

"respond_to?" 方法似乎以这种方式工作:

class Person
  def say_bye
    puts 'bye'
  end
end

mike = Person.new
puts mike.respond_to?(:say_bye)
mike.say_bye
Run Code Online (Sandbox Code Playgroud)

输出是:

true
bye
Run Code Online (Sandbox Code Playgroud)

有没有人知道为什么"respond_to?" 在第一种情况下返回false?

ruby

8
推荐指数
1
解决办法
4473
查看次数

基于用户表单的动态Active Record Store访问器?

Active Record Store允许您序列化单个单元格内的参数.

class User < ActiveRecord::Base
  store :options, accessors: [ :option1, :option2, :another_random_option ]
end
Run Code Online (Sandbox Code Playgroud)

所有访问器现在都在users表的"options"列中序列化.

u = User.new
u.option2 = 'some option'
u.option2 # => 'some option'
Run Code Online (Sandbox Code Playgroud)

这对我的应用程序很有用,因为我必须每天创建多个表单,其中90%的表单是相同的(用户名,爱好,兴趣等),然后10%是无模式(random_option_here,another_random_option_in_another_form) .我也永远不需要按无架构选项排序.

我做的是我为90%的表单字段创建了1个表,它们始终是相同的,然后我有另一个表,其中包含最后10%的字段(我有另一个表的原因是因为这是belongs_to关系,因此用户可以在此表中有许多行).

<%= form_tag do %> 
  <%= #render partial form for an object that has non-changing fields %>
  ...
  <%= #render a schema-less partial form based off an ID passed here %>
<% end >
Run Code Online (Sandbox Code Playgroud)

现在唯一的问题是每次我在自定义表单中创建一个新字段时,我必须将该参数添加到Active Record Store访问器,否则我会得到一个方法缺失错误.如果我可以进入并为无模式字段创建尽可能多的View表单并且永远不更新模型中的访问器,那将是很好的.

所以我的问题是:是否有动态添加所有用户提交的自定义字段到访问者数组,这样如果用户提交字段"some_random_option1221","another_option_here"然后我不必进入访问者数组并添加那个领域?

谢谢!

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

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

Rails 4,资产管道导致用户可下载文件被下载两次

我的app目录中有一个名为"uploads"的文件夹,用户可以在其中上传文件和下载文件.我不希望uploads文件夹在公共目录中,因为我想控制下载授权.

在我的控制器中,我有:

send_file Rails.root.join('app', 'uploads', filename), :type => 'application/zip', :disposition => 'inline', :x_sendfile=>true
Run Code Online (Sandbox Code Playgroud)

这实际上很好.问题是,当我在生产服务器上,当我运行rake资产:预编译,并有一个资产目录时,该文件下载两次.该文件第一次下载时,浏览器就像没有进行任何操作一样(没有加载旋转),但我看到数据正在谷歌Chrome开发人员网络选项卡中传输.然后在下载文件后,会出现提示,询问用户是否要下载文件.

删除公共目录中的assets文件夹可以解决此问题,但我想使用资产管道.我还尝试将require_tree中的资产管道需求更改为require_directory.

有谁知道如何让send_file与资产管道一起正常工作?

谢谢.

ruby-on-rails sendfile ruby-on-rails-4

3
推荐指数
1
解决办法
1232
查看次数

混淆了实例变量范围,顶级与类

我一直在使用Ruby,主要是在顶层,我通常编写如下代码:

@x = 'foo'
def show_var
  puts @x
end

show_var # => foo
Run Code Online (Sandbox Code Playgroud)

我认为实例变量可用于Class和Object,基于此示例的工作原理.

今天我碰到了这个,看起来我对实例变量的理解是不正确的:

class Test
  @x = "foo" #you would need to define this inside 'initialize' for this to be available to show_var
  def show_var
    puts @x
  end 
end

Test.new.show_var # => nil
Run Code Online (Sandbox Code Playgroud)

看起来第二个例子是实例变量的工作原理.如果在Class中定义了一个实例变量,那么它只存在于该范围内,并且对于实例方法不存在.

那么我的问题是......当变量@x不应该存在于实例方法的范围内时,为什么第一种情况输出'foo'?另外,在顶级类中定义要用于顶级方法的变量的正确方法是什么?

ruby

3
推荐指数
1
解决办法
677
查看次数

如果非主键列重复,则更新MySQL表,否则插入?

我有一个带有自动增量主键的MySQL表,以及一个人名的列和一些数据.

是否存在MySQL查询,如果此人的姓名是唯一的,我可以插入新行,但如果它是重复的名称,那么我会更新该行吗?

ID, Name,        Data
1 , Michael,     x
2 , Stephen,     y
3 , Christopher, z
Run Code Online (Sandbox Code Playgroud)

如果我使用"qq"数据向数据库添加"Michael",我希望数据库看起来像这样:

ID, Name,        Data
1 , Michael,     qq
2 , Stephen,     y
3 , Christopher, z
Run Code Online (Sandbox Code Playgroud)

如果我要用"zz"数据添加"John",数据库将如下所示:

ID, Name,        Data
1 , Michael,     x
2 , Stephen,     y
3 , Christopher, z
4 , John,        zz
Run Code Online (Sandbox Code Playgroud)

我知道命令,ON DUPLICATE KEY UPDATE,但我只想更新名称是否相同,而不是主键是否相同.

php mysql

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

Active Record has_many关系三层深吗?

class State < ActiveRecord::Base
  has_many :cities
end

class City < ActiveRecord::Base
  has_many :zipcodes
  belongs_to :state
end

class Zipcode < ActiveRecord::Base
  belongs_to :city
end
Run Code Online (Sandbox Code Playgroud)

当我尝试做:

State.first.cities.zipcodes
Run Code Online (Sandbox Code Playgroud)

我收到一个ActiveRecord::Associations::CollectionProxy错误.

有没有人知道如何使用has_many关系深入多层次?我确实使用该through:选项使这个工作,但无论如何不使用该through:选项吗?

activerecord ruby-on-rails

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