我有一个简单的类,并且正在转置一个二维数组,如下所示:
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)
为什么这不起作用?
我正在使用一些模型,其中许多给定模型的关键属性实际存储在子模型中.
例:
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一样自动创建所有这些方法?
我似乎无法解决这个问题.
我想在没有数据库的情况下完成此任务:
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) 这是我的课,你可以看到,没有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中,如果我有一个类greet并且有一个方法say_hi,"Hello #{@name}"当name是类的实例变量时打印出来greet,并且我允许@name通过添加来访问attr_accessor :name,所以现在我可以直接更改@name.
但是,attr_accessor如果我不再希望人们能够@name直接更改,我该如何删除它?
在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
我正在尝试在我的模型中进行一些条件验证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)
我一直在谷歌上寻找解决方案。我看到了一项建议,要求编辑我的控制器以适应这一点,但由于多种原因,这似乎并不是最佳选择。我在这里可能会缺少什么?
提前致谢。
我想知道如何动态创建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) 我正在尝试用条纹创建电荷.尝试创建订单对象时出现以下错误,但我设置了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
我有一个包含许多不同类的单个模块(分成单独的文件).每个类都有相同的集合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 对象实例的属性,我可以使用以下代码快速完成:
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?