我是Ruby和Rails的新手。在我的Rails应用程序中,我试图使用Wicked Wizard gem,需要一些帮助来理解我在代码中遇到的cattr_accessor
# migration
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
# model
class Pet < ActiveRecord::Base
has_many :pet_photos
cattr_accessor :form_steps do
%w(identity characteristics instructions)
end
attr_accessor :form_step
validates :email, presence: true
validates :name, :owner_name, presence: true, if: -> { required_for_step?(:identity) }
validates :identifying_characteristics, :colour, presence: true, if: -> { required_for_step?(:characteristics) }
validates :special_instructions, presence: true, if: -> { required_for_step?(:instructions) }
def required_for_step?(step)
return true if form_step.nil?
return true if self.form_steps.index(step.to_s) <= self.form_steps.index(form_step)
end
end
# controller
class Pet::StepsController < ApplicationController
include Wicked::Wizard
steps *Pet.form_steps
def show
@pet = Pet.find(params[:pet_id])
render_wizard
end
def update
@pet = Pet.find(params[:pet_id])
@pet.update(pet_params(step))
if params[:images]
params[:images].each do |image|
@pet.pet_photos.create(image: image)
end
end
render_wizard @pet
end
private
def pet_params(step)
permitted_attributes = case step
when "identity"
[:name, :owner_name]
when "characteristics"
[:colour, :identifying_characteristics]
when "instructions"
[:special_instructions]
end
params.require(:pet).permit(permitted_attributes).merge(form_step: step)
end
end
# routes
PetThing::Application.routes.draw do
resources :pets, only: [:new, :create, :index, :destroy] do
resources :steps, only: [:show, :update], controller: 'pet/steps'
end
root to: 'pets#index'
end
字符串
现在我的问题是:
1)cattr_accessor
和attr_accessor
有什么区别?
cattr_accessor :form_steps do
%w(identity characteristics instructions)
end
attr_accessor :form_step
型
**2)**为什么cattr_accessor
和attr_accessor
的方法参数分别使用两个不同的符号(:form_steps
,:form_step
)?
**3)**为什么一个块作为参数传递给cattr_accessor
方法?
1条答案
按热度按时间eufgjt7s1#
首先,这个方法已经被弃用或移动了。你使用哪个版本,Rails 4还是Rails?
cattr_accessor
>为mattr_accessor(*syms, &blk)
替换了Module
,它是Class
类的超类。我建议使用attr_accessor,这只是一个为类设置属性的方法,它的工作方式类似于类的getter或setter,但只适用于示例(在内存中),属性保存在任何地方。cattr_accessor
类似于attr_*
方法,但用于类级别。有一件事你不会想到,因为它使用了一个支持@@form_steps
,这个值在类和所有示例之间共享。API文档:
为类属性定义类和示例访问器。
字符串
如果子类改变了值,那么父类的值也会改变。同样,如果父类改变了值,那么子类的值也会改变。
型
要退出示例编写器方法,请传递instance_writer:false。要退出示例读取器方法,请传递instance_reader:false。
型
或者传递
instance_accessor: false
,以选择退出这两个示例方法。型
你也可以传递一个块来设置属性的默认值。
型
1)
**2)**类变量有在类间游走的倾向,@@form_steps类变量可以通过继承树暴露。
**3)**设置哪些属性会有这个类。
form_steps
型
并在当前示例Pet中使用
form_steps
属性(就像在方法required_for_step?
中所做的那样)。