编辑:我使用的是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?
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"然后我不必进入访问者数组并添加那个领域?
谢谢!
我的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,主要是在顶层,我通常编写如下代码:
@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'?另外,在顶级类中定义要用于顶级方法的变量的正确方法是什么?
我有一个带有自动增量主键的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,但我只想更新名称是否相同,而不是主键是否相同.
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:选项吗?