标签: attr-accessor

Ruby attr_accessor 包装器返回 nil。

我有一个简单的类,并且正在转置一个二维数组,如下所示:

class Group
  attr_accessor :group_array
  def initialize
    @group_array = []
  end

  ...

  def shuffle_groups!
    new_groups = group_array.transpose
    group_array = new_groups
  end

end
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试在一行中设置新的组数组时,如下所示:

def shuffle_groups!
    group_array = group_array.transpose
end
Run Code Online (Sandbox Code Playgroud)

我得到:

undefined method `transpose' for nil:NilClass
Run Code Online (Sandbox Code Playgroud)

为什么这不起作用?

ruby transpose attr-accessor

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

Ruby on Rails:子模型的attr_accessor

我正在使用一些模型,其中许多给定模型的关键属性实际存储在子模型中.

例:

class WikiArticle
  has_many :revisions
  has_one :current_revision, :class_name => "Revision", :order => "created_at DESC"
end
class Revision
  has_one :wiki_article
end
Run Code Online (Sandbox Code Playgroud)

Revision类有很多数据库字段,WikiArticle很少.但是,我经常需要从WikiArticle的上下文访问Revision的字段.最重要的情况可能是创建一篇文章.我一直在这样做,有很多看起来像这样的方法,每个领域一个:

def description
  if @description
    @description
  elsif current_revision
    current_revision.description
  else
    ""
  end  
end
def description=(string)
  @description = string
end
Run Code Online (Sandbox Code Playgroud)

然后在我的保存中,我将@description保存到新版本中.

这一切都让我想起了很多attr_accessor,只是看起来我不能让attr_accessor去做我需要的东西.我如何定义一个attr_submodel_accessor,这样我就可以给出字段名称并让它像attr_accessor一样自动创建所有这些方法?

ruby-on-rails attr-accessor

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

是否可以使用attr_accessors使用Object.new(:attribute =>"foobar")创建对象?

我似乎无法解决这个问题.

我想在没有数据库的情况下完成此任务:

Object.new(:attribute_1 => "foobar", :attribute_2 => "foobar")
Run Code Online (Sandbox Code Playgroud)

那回报:

ArgumentError: wrong number of arguments (1 for 0)
    from (irb):5:in `initialize'
    from (irb):5:in `new'
    from (irb):5
Run Code Online (Sandbox Code Playgroud)

我的模特:

class Object
  extend ActiveModel::Naming
  include ActiveModel::Conversion

  def persisted?
    false
  end

  attr_accessor :attribute_1, :attribute_2
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails attr-accessor

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

如果没有我设置attr_accessor,Rails已经有了getter和setter.如何阻止所有的二传手?

这是我的课,你可以看到,没有attr_accessor

class LegacyBlogPost < ActiveRecord::Base
  establish_connection Rails.configuration.database_configuration['blogs']
  self.table_name = 'blogpost'
  self.primary_key = 'post_id'
end
Run Code Online (Sandbox Code Playgroud)

但我仍然可以读写所有变量.这是默认行为吗?

x = LegacyBlogPost.find(172925)
x.title += "."
x.save
=> true
Run Code Online (Sandbox Code Playgroud)

我的主要问题是,我如何避免写这门课?我明白我可以让mysql用户只允许做select语句.另外我相信我可以重新编写rails setter,只要方法被击中就返回.但是我假设我只是为了一切设置了attr_reader,作家就不会在那里.

ruby-on-rails attr-accessor

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

如何删除ruby中的attr_accessor

在ruby中,如果我有一个类greet并且有一个方法say_hi,"Hello #{@name}"当name是类的实例变量时打印出来greet,并且我允许@name通过添加来访问attr_accessor :name,所以现在我可以直接更改@name.

但是,attr_accessor如果我不再希望人们能够@name直接更改,我该如何删除它?

ruby attr-accessor

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

当我渲染json时,attr_accessor的属性不显示

在Rails中,我有一个User模型。我添加attr_accessor :score了模型。

如果为一个用户呈现JSON,则看不到“得分”属性。为什么是这样?

user = User.find(3)
user.score = 55
render json: user
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails attr-accessor ruby-on-rails-4 rails-activerecord

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

使用 attr_accessor 在 Rails 中进行条件验证

我正在尝试在我的模型中进行一些条件验证Company。基本上这个想法是Company由许多不同的控制器使用,每个控制器都有自己的验证要求。我的想法是添加attr_accessor一个属性来标识有问题的控制器,如下所示:

<%= company.hidden_field :controller_context, value: "incorporation" %>
Run Code Online (Sandbox Code Playgroud)

但是,我无法:controller_context在验证中用作条件。

validate :final_incorporation, if: "controller_context=='incorporation'"
Run Code Online (Sandbox Code Playgroud)

上面没有给我错误,但也没有触发验证。controller_context但是,如果我尝试使用以下命令获取日志中的值:

logger.debug "controller_context: #{controller_context}"
Run Code Online (Sandbox Code Playgroud)

我收到错误

undefined local variable or method `controller_context' 
Run Code Online (Sandbox Code Playgroud)

我一直在谷歌上寻找解决方案。我看到了一项建议,要求编辑我的控制器以适应这一点,但由于多种原因,这似乎并不是最佳选择。我在这里可能会缺少什么?

提前致谢。

validation ruby-on-rails attr-accessor ruby-on-rails-4

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

Ruby:如何动态创建attr_accessor

我想知道如何动态创建attr_accessor.有可能做这样的事情:

attr_accessor "@#{key}" 
Run Code Online (Sandbox Code Playgroud)

在initialize方法里面?

module Mymodule
  def initialize(parameters = {})
    parameters.each do |key, value|
      instance_variable_set("@#{key}", value) unless value.nil?
    end
  end
end

class Myclass
  include Mymodule
end

clazz = Myclass.new attr1: "Arg1", attr2: "Arg2", attr3: "Arg3"
  # => #<Myclass:0x43f6050 @attr1="Arg1", @attr2="Arg2", @attr3="Arg3">

clazz.attr1
  # !> NoMethodError: undefined method `attr1' for #<Myclass:0x43f6050 @attr1="Arg1", @attr2="Arg2", @attr3="Arg3">

clazz.attr1="ATTR1"
  # !> NoMethodError: undefined method `attr1=' for #<Myclass:0x43f6050 @attr1="Arg1", @attr2="Arg2", @attr3="Arg3">
Run Code Online (Sandbox Code Playgroud)

ruby attributes attr-accessor

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

无法批量分配受保护的属性:stripe_card_token

我正在尝试用条纹创建电荷.尝试创建订单对象时出现以下错误,但我设置了attr_accessor:stripe_card_token.有谁知道我做错了什么?

ActiveModel::MassAssignmentSecurity::Error in OrdersController#create
Can't mass-assign protected attributes: stripe_card_token
Run Code Online (Sandbox Code Playgroud)

OrdersController - 创建动作

def create
@order = current_cart.build_order(params[:order])
@order.ip_address = request.remote_ip
@order.user_id = current_user.id


respond_to do |format|
  if @order.save_with_payment

    @order.add_line_items_from_cart(current_cart)         
    Cart.destroy(session[:cart_id])
    session[:cart_id] = nil


    format.html { render :action => "success", :notice => 'Thank you for your order.' }
    format.xml { render :xml => @order, :status => :created, :location => @order }

  else
    format.html { render :action => "new" }
    format.xml { render :xml => @order.errors,
    :status => :unprocessable_entity }
  end
end …
Run Code Online (Sandbox Code Playgroud)

shopping-cart ruby-on-rails mass-assignment attr-accessor stripe-payments

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

跨多个类的attr_accessor?

我有一个包含许多不同类的单个模块(分成单独的文件).每个类都有相同的集合attr_accessor,那么如何重用它而不必重复attr_accessor块?

我现在在做什么......

# dog.rb
module Animals
   class Dog
      attr_accessor :name, :color, :age 
   end
end

# cat.rb
module Animals
   class Cat
      attr_accessor :name, :color, :age 
   end
end

# rodent.rb
module Animals
   class Rodent
      attr_accessor :name, :color, :age 
   end
end
Run Code Online (Sandbox Code Playgroud)

我试着这样做没有运气......

# animals.rb
module Animals
   attr_accessor :name, :color, :age 
end
Run Code Online (Sandbox Code Playgroud)

我需要直接在我的应用程序中访问这些模块(这是一个Rails应用程序).例如:Animals::Dog.give_water

ruby module class attr-accessor

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

Ruby 中的 attr_accessor 和元编程

嗨,我想通过一些配置文件动态地初始化 ruby​​ 对象实例的属性,我可以使用以下代码快速完成:

class ApiTester

  def initialize(path= "api_test")
    h = eval(File.open("#{path}/config.hash","r").read)
    h.each do |k,v|
      eval("@#{k}=#{v.class == String ? "\"#{v}\"" :  v }" )
    end
  end

end
Run Code Online (Sandbox Code Playgroud)

如何为属性“@#{k}”提供属性 attr_accessor?

ruby metaprogramming attr-accessor

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