好的,我正在慢慢掌握这一点,但我还需要一些帮助.
我在我的视图中使用了time_select,因此我正在处理多参数分配.校验.
<%= pt.time_select :time, :twelve_hour => true, :minute_step => 5 %>
Run Code Online (Sandbox Code Playgroud)
但我正在做顽皮的事情,并使用不在数据库中的属性:
attr_accessor time
Run Code Online (Sandbox Code Playgroud)
因此,因为它无法查看数据库,所以它无法拼凑多参数分配应该是什么,因此我收到以下错误:
1 error(s) on assignment of multiparameter attributes
Run Code Online (Sandbox Code Playgroud)
因此,我使用,我发现的信息在这里:
composed_of :time,
:class_name => 'DateTime',
:mapping => [%w(DateTime to_s)],
:constructor => Proc.new{ |item| item },
:converter => Proc.new{ |item| item }
Run Code Online (Sandbox Code Playgroud)
其他有用的链接:rubyonrails.org | apidock.com
这消除了错误,但现在问题是我正在使用的插件无法正常运行,我想.我在用http://code.google.com/p/rails-twelve-hour-time-plugin/.目标是,我正在努力让时间选择有3个下降hh:mm am/pm.
所以问题是:我如何调整我composed_of method的顺序才能通过插件正确转换?或者这种疯狂有更好的方法吗?
我不确定我需要什么映射器/构造器/转换器.现在,对象保持小时和分钟,除了小时没有转换为24小时(插件应该照顾,我想).
我最近被以下代码难住了:
class Foo
attr_accessor :n
def initialize(i)
@n = i
end
def val
n
end
def bump!
n += 1
end
end
f = Foo.new(0)
puts f.val
f.bump!
Run Code Online (Sandbox Code Playgroud)
puts f.val成功并按0预期打印出来.f.bump!导致以下情况NoMethodError
foo.rb:13:in `bump!': undefined method `+' for nil:NilClass (NoMethodError)
from foo.rb:20:in `<main>'
Run Code Online (Sandbox Code Playgroud)
任何想法,为什么n是nil在表达n += 1?
n = 1 + n相反,使用引发a TypeError(nil cannot be coerced into Fixnum),n实际上也是如此nil.
请检查伪代码:
class Team
has_many :users
accepts_nested_attributes_for :users, allow_destroy: true
end
class User
belongs_to :team
has_many :addresses
accepts_nested_attributes_for :addresses
attr_accessor :dummy
before_validation :generate_addresses_attributes
def generate_addresses_attributes
# Use the dummy value to set the addresses_attributes
end
end
Run Code Online (Sandbox Code Playgroud)
现在执行时team.update(users_attributes: [{"0" => { dummy: "changed!" }}])(其他字段除了dummy属性不会改变),它不会触发#generate_addresses_attributes回调,因为它认为没有任何改变,没有保存,没有回调......
所以我的问题是如何触发虚拟属性的回调,或者强制save为accept_nested_attributes_for.
谢谢!
我正在检索"Widget"ActiveRecord对象:
@widget = Widget.find(params[:id])
Run Code Online (Sandbox Code Playgroud)
我想在返回之前添加一些额外的数据,所以我使用以下方法添加它:
@widget.display_name = "test display name"
Run Code Online (Sandbox Code Playgroud)
我可以做puts @widget.display_name,这确实显示"测试显示名称",但是当我调用puts @widget.inspect它时不包括额外的数据.
我原来得到:
NoMethodError (undefined method `display_name=' for # <Widget:0x007fe6147e8e00>):
Run Code Online (Sandbox Code Playgroud)
但我包含attr_accessor :display_name在Widget模型中,并停止了该特定消息.
为了清楚起见,我实际上并不想将这些额外的数据存储在数据库中,而只是将其作为JSON对象返回.我正在使用JSON渲染render json: @widget, status: :ok,这也不包括额外的数据.
为清楚起见,这是我的代码:
def show
@widget = Widget.find(params[:id])
@widget.display_name = "test display name"
puts @widget.display_name # displays "test display name"
puts @widget.inspect
if @widget
render json: @widget, status: :ok
else
head :not_found
end
end
Run Code Online (Sandbox Code Playgroud) 我有这个代码:
class A
attr_accessor :count
def initialize
@count = 0
end
def increase_count
count += 1
end
end
A.new.increase_count
Run Code Online (Sandbox Code Playgroud)
它抱怨说:
in `increase_count': undefined method `+' for nil:NilClass (NoMethodError)
Run Code Online (Sandbox Code Playgroud)
如果我将increase_count定义更改为:
class A
def increase_count
@count += 1
end
end
Run Code Online (Sandbox Code Playgroud)
然后它不会抱怨.可能是我遗漏了一些东西,或者这只是Ruby的奇怪行为.
我的模型,"DataFile",有一堆字段,我想从模型外部设置,例如
file = DataFile.new file.owner = 123
现在,据我所知,我必须在我的模型中放置一个"attr_accessor:field",用于我想从外部修改的每个字段.但是,上面的代码运行正常,没有定义任何attr_accessors,将owner字段设置为123.为什么?
我希望得到一个"方法未定义"错误或类似的东西.
我正在使用Ruby on Rails 3.0.9,我想检索attr_accessor以特定字符串开头的所有属性名称.那是,
...在我的模块中我有:
attr_accessor :prefix_attribute_name1,
:prefix_attribute_name2,
:prefix_attribute_name3,
...
:attribute_name1,
:attribute_name2,
...
Run Code Online (Sandbox Code Playgroud)
而我想检索所有attr_accessor与该启动属性名称:prefix的字符串. 我怎样才能做到这一点?
我想实现一个(类)方法attr_accessor_with_client_reset,它执行相同的操作attr_accessor,但是在它另外执行的每个编写器上
@client = nil
Run Code Online (Sandbox Code Playgroud)
所以,例如,
attr_accessor_with_client_reset :foo
Run Code Online (Sandbox Code Playgroud)
应该产生相同的结果
attr_reader :foo
def foo=(value)
@foo = value
@client = nil
end
Run Code Online (Sandbox Code Playgroud)
我该如何实现这一目标?
我有一个代码:
class A
attr_accessor :somevar
def a
somevar = 'something'
puts @somevar
end
def b
send :somevar=, 'something'
puts @somevar
end
end
A.new.a #=> nil
A.new.b #=> 'something'
Run Code Online (Sandbox Code Playgroud)
为什么会有区别?为什么我不能通过编写器分配实例变量?但是为什么已经调用了局部变量而不是方法(setter)呢?
这是我正在使用的结构:
应用程序/模型/ model.rb
class Model < ActiveRecord::Base
attr_accessor :some_var
end
Run Code Online (Sandbox Code Playgroud)
应用程序/模型/ model_controller.rb
class ModelsController < ApplicationController
def show
@model = Model.find(params[:id])
@other_var
if @model.some_var.nil?
@model.some_var = "some value"
@other_var = "some value"
else
@other_var = @model.some_var
end
end
end
Run Code Online (Sandbox Code Playgroud)
每当我运行此代码(例如show方法)时,if子句被评估为true(例如@ model.some_var == nil).我该如何解决这个问题?我对attr_accessor的工作方式有什么不妥吗?