标签: attr-accessor

Ruby on Rails - 多参数赋值和attr_accessor以及12_hour_time

好的,我正在慢慢掌握这一点,但我还需要一些帮助.

我在我的视图中使用了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小时(插件应该照顾,我想).

ruby-on-rails attr-accessor

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

Ruby attr_reader和+ =

我最近被以下代码难住了:

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)

任何想法,为什么nnil在表达n += 1

n = 1 + n相反,使用引发a TypeError(nil cannot be coerced into Fixnum),n实际上也是如此nil.

ruby attr-accessor

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

Rails4:如何在使用accepts_nested_attributes_for时触发attr_accessor的回调

请检查伪代码:

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.

谢谢!

callback nested-attributes attr-accessor ruby-on-rails-4

3
推荐指数
2
解决办法
1214
查看次数

将其他数据添加到ActiveRecord对象

我正在检索"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)

json ruby-on-rails attr-accessor

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

存取方法已定义但不起作用

我有这个代码:

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的奇怪行为.

ruby attr-accessor

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

了解Ruby on Rails ActiveRecord模型访问器

我的模型,"DataFile",有一堆字段,我想从模型外部设置,例如

file = DataFile.new
file.owner = 123

现在,据我所知,我必须在我的模型中放置一个"attr_accessor:field",用于我想从外部修改的每个字段.但是,上面的代码运行正常,没有定义任何attr_accessors,将owner字段设置为123.为什么?

我希望得到一个"方法未定义"错误或类似的东西.

ruby activerecord model ruby-on-rails attr-accessor

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

如何检索'attr_accessor'属性名称?

我正在使用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的字符串. 我怎样才能做到这一点?

ruby attributes ruby-on-rails attr-accessor ruby-on-rails-3

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

如何增强ruby中的attr_accessor?

我想实现一个(类)方法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)

我该如何实现这一目标?

ruby attributes metaprogramming attr-accessor

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

Ruby:从内部方法访问attr_accessor的方法

我有一个代码:

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)呢?

ruby attr-accessor

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

Rails模型attr_accessor属性不保存?

这是我正在使用的结构:

应用程序/模型/ 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的工作方式有什么不妥吗?

model ruby-on-rails attr-accessor

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