以编程方式访问ActiveRecord虚拟属性

时间:2015-03-07 11:44:51

标签: ruby-on-rails ruby-on-rails-4

我有这个部分,我应该生成一个代码块,我会在页面中重复一遍。

主视图有这样的内容:

index.html.haml

=render 'dropdownboxes', name: 'Locations', association: @locations, option: 'name', option_id: 'id', query: 'location'

部分包含与此类似的内容(haml):

_dropdownboxes.html.haml

.btn-group
  %button.btn-u.btn-u-sm.btn-u-dark.dropdown-toggle{'data-toggle' => 'dropdown'}
    =name
    %i.fa.fa-angle-down
  %ul.dropdown-menu{:role => 'menu'}
    - association.each do |c|
     %li=link_to c[option], params.merge({query => c[option_id]})

在您惊慌失措之前,我会拆分参数,以便查询不会受到控制器中XSS攻击的攻击。<​​/ em>

最后一行会产生类似于此的链接:

<a href="/search/?state=1">California</a>

这适用于某些情况,但是,当我在模型上使用虚拟属性时,生成的链接无法按预期工作;特别是&#39;选项&#39;价值是零。

该模型有两个字段,&#34; city&#34;和&#34;州&#34;。在模型中,我将此虚拟属性定义为:

location.rb

def place
  [city, state].join(', ')
end

从控制台:

> test=Location.all.first
> test.id            # => 1
> test.['id']        # => 1
> test.city          # => "Los Angeles"
> test['city']       # => "Los Angeles"
> test.state         # => "California"
> test['state']      # => "California"
> test.place         # => "Los Angeles, California"
> test['place']      # => nil

因此虚拟属性显示为nil,我认为这是因为它没有被解析为数组。当我尝试使用部分渲染将其发送到html时,它会输出如下内容:

<a href="/search/?location=1">/search/?location=1</a>

我试图以这种方式访问​​它,因为我在上面描述的部分中使用c[option]来检索该值。有没有更好的方法来访问虚拟值而无需切换到数组?

1 个答案:

答案 0 :(得分:2)

您可以使用send按名称调用Ruby方法:

c.send('place')

这适用于纯Ruby方法(即您的“虚拟属性”)和ActiveRecord属性,而c['place']仅适用于后者。