def place
@place = Activity.find(params[:id])
end
如何选择特定的参数?我们有activity.address1,2,zip状态等,只需要一个我们可以使用的实例变量,它等于地址属性。
答案 0 :(得分:0)
您可以做类似的事情:
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']