Вы могли бы сделать что-то вроде:
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']