Ruby on rails 理解cattr_访问器在Rails模型类中的用法

Ruby on rails 理解cattr_访问器在Rails模型类中的用法,ruby-on-rails,ruby,wicked-gem,Ruby On Rails,Ruby,Wicked Gem,我是ruby和rails的新手。 在我的Rails应用程序中,我正在尝试使用Wizard gem,需要一些帮助来了解我在代码中遇到的cattr_访问器 create_table "pets", force: :cascade do |t| t.string "name" t.string "colour" t.string "owner_name" t.text "identi

我是ruby和rails的新手。 在我的Rails应用程序中,我正在尝试使用Wizard gem,需要一些帮助来了解我在代码中遇到的cattr_访问器

  create_table "pets", force: :cascade do |t|
            t.string   "name"
            t.string   "colour"
            t.string   "owner_name"
            t.text     "identifying_characteristics"
            t.text     "special_instructions"
            t.datetime "created_at"
            t.datetime "updated_at"
            t.string   "email"
            t.string   "password"
          end
模型

现在我的问题是

1)cattr\U存取器和attr\U存取器之间的区别是什么

       cattr_accessor :form_steps do
       %w(identity characteristics instructions)
       end
       attr_accessor :form_step
2)为什么将两个不同的符号(
:form\u steps
:form\u step
)分别用作
cattr\u访问器
attr\u访问器
方法的方法参数

3)为什么块作为参数传递给
cattr\u访问器
方法


非常感谢您的帮助。谢谢您首先,此方法已被弃用或移动。 您使用哪个版本,Rails 4还是Rails

cattr\u存取器
>替换为
mattr\u存取器(*syms,&blk)
用于
模块
,模块是类
的超类。我建议使用attr\u accessor,它只是一种为类设置属性的方法,它的工作原理类似于类的getter或setter,但只适用于实例(内存中),属性保存在任何位置

cattr\u访问器
类似于
attr\u*
方法,但用于类级别。您不希望看到的一件事是,它使用了一个backing
@@form\u steps
,即类和所有实例之间共享的值

Api文档: 定义类属性的类访问器和实例访问器

module HairColors
  mattr_accessor :hair_colors
end

class Person
  include HairColors
end

Person.hair_colors = [:brown, :black, :blonde, :red]
Person.hair_colors     # => [:brown, :black, :blonde, :red]
Person.new.hair_colors # => [:brown, :black, :blonde, :red]
如果一个子类更改了值,那么这也会更改父类的值。类似地,如果父类更改了值,那么子类的值也会更改

class Male < Person
end

Male.hair_colors << :blue
Person.hair_colors # => [:brown, :black, :blonde, :red, :blue]
或者传递
实例\u访问器:false
,以选择退出这两个实例方法

module HairColors
  mattr_accessor :hair_colors, instance_accessor: false
end

class Person
  include HairColors
end

Person.new.hair_colors = [:brown]  # => NoMethodError
Person.new.hair_colors             # => NoMethodError
还可以传递一个块,以设置具有默认值的属性

module HairColors
  mattr_accessor :hair_colors do
[:brown, :black, :blonde, :red]
  end
end

class Person
  include HairColors
end

Person.class_variable_get("@@hair_colors") #=> [:brown, :black, :blonde, :red]
1)

  • attr_accessor:是一个生成getter和setter的ruby方法
  • cattr_accessor:是一个ruby方法,它为类生成getter和setter(非常奇怪)
2) 类变量有从一个类移动到另一个类的趋势@@form_steps类变量可以通过继承树公开

3)设置哪些属性将具有此类<代码>表格步骤

p = Pet.new
p.form_steps = "var"

并在当前实例宠物中使用
form\u steps
属性(就像您在方法
required\u for\u step?
中所做的那样)。

首先,此方法已被弃用或移动。 您使用哪个版本,Rails 4还是Rails

cattr\u存取器
>替换为
mattr\u存取器(*syms,&blk)
用于
模块
,模块是类
的超类。我建议使用attr\u accessor,它只是一种为类设置属性的方法,它的工作原理类似于类的getter或setter,但只适用于实例(内存中),属性保存在任何位置

cattr\u访问器
类似于
attr\u*
方法,但用于类级别。您不希望看到的一件事是,它使用了一个backing
@@form\u steps
,即类和所有实例之间共享的值

Api文档: 定义类属性的类访问器和实例访问器

module HairColors
  mattr_accessor :hair_colors
end

class Person
  include HairColors
end

Person.hair_colors = [:brown, :black, :blonde, :red]
Person.hair_colors     # => [:brown, :black, :blonde, :red]
Person.new.hair_colors # => [:brown, :black, :blonde, :red]
如果一个子类更改了值,那么这也会更改父类的值。类似地,如果父类更改了值,那么子类的值也会更改

class Male < Person
end

Male.hair_colors << :blue
Person.hair_colors # => [:brown, :black, :blonde, :red, :blue]
或者传递
实例\u访问器:false
,以选择退出这两个实例方法

module HairColors
  mattr_accessor :hair_colors, instance_accessor: false
end

class Person
  include HairColors
end

Person.new.hair_colors = [:brown]  # => NoMethodError
Person.new.hair_colors             # => NoMethodError
还可以传递一个块,以设置具有默认值的属性

module HairColors
  mattr_accessor :hair_colors do
[:brown, :black, :blonde, :red]
  end
end

class Person
  include HairColors
end

Person.class_variable_get("@@hair_colors") #=> [:brown, :black, :blonde, :red]
1)

  • attr_accessor:是一个生成getter和setter的ruby方法
  • cattr_accessor:是一个ruby方法,它为类生成getter和setter(非常奇怪)
2) 类变量有从一个类移动到另一个类的趋势@@form_steps类变量可以通过继承树公开

3)设置哪些属性将具有此类<代码>表格步骤

p = Pet.new
p.form_steps = "var"
并在当前实例宠物中使用
form\u steps
属性(就像您在方法
required\u for\u step?
中所做的那样)。

可能重复的