您可以执行以下操作:
def place
@place ||= Activity.find(params[:id])
@address_attributes = @place.attributes.slice('address_1', 'address_2', 'zip', 'state')
end
在这种情况下,您将拥有一个实例变量,其中包含指定属性的哈希值,您可能会使用如下内容:
@address_attributes['address_1']
就个人而言,我发现在键值周围键入'' 很烦人,并且更喜欢使用符号。在这种情况下,您可能会执行以下操作:
def place
@place ||= Activity.find(params[:id])
@address_attributes = @place.attributes.with_indifferent_access.slice(:address_1, :address_2, :zip, :state)
end
你会使用类似的东西:
@address_attributes[:address_1]
但是,即使是括号和符号也有点烦人。所以,你可能会做这样的事情:
def place
@place ||= Activity.find(params[:id])
@address_attributes = OpenStruct.new(@place.attributes.with_indifferent_access.slice(:address_1, :address_2, :zip, :state))
end
然后你可以使用类似的东西:
@address_attributes.address_1
现在,就个人而言,我不喜欢 place 方法中的那条长线,所以我很想这样做:
def place
@place ||= Activity.find(params[:id])
@address_attributes = get_address_attributes
end
private
def get_address_attributes
OpenStruct.new(
@place.
attributes.
with_indifferent_access.
slice(
:address_1,
:address_2,
:zip,
:state
)
)
end
现在,如果这一切都在控制器中,并且您设置 @address_attributes 变量只是为了在视图中使用它,那么也许这已经足够了。
但是,如果您在当前实例的其他地方使用 @address_attributes 变量,那么您可能会考虑执行以下操作:
attr_accessor *%w(
address_attributes
).freeze
delegate *%w(
address_1
address_2
zip
state
), to: :address_attributes, prefix: place
def place
@place ||= Activity.find(params[:id])
@address_attributes = get_address_attributes
end
private
def get_address_attributes
OpenStruct.new(
@place.
attributes.
with_indifferent_access.
slice(
:address_1,
:address_2,
:zip,
:state
)
)
end
在这种情况下,您可以拨打以下电话:
place_address_1
这似乎比类似的更好:
@address_attributes['address_1']