将实例变量设置为仅等于特定模型参数

时间:2019-01-09 19:03:17

标签: ruby-on-rails ruby activerecord

def place
  @place = Activity.find(params[:id])
end

如何选择特定的参数?我们有activity.address1,2,zip状态等,只需要一个我们可以使用的实例变量,它等于地址属性。

1 个答案:

答案 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']