我有这个部分,我应该生成一个代码块,我会在页面中重复一遍。
主视图有这样的内容:
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]
来检索该值。有没有更好的方法来访问虚拟值而无需切换到数组?
答案 0 :(得分:2)
您可以使用send
按名称调用Ruby方法:
c.send('place')
这适用于纯Ruby方法(即您的“虚拟属性”)和ActiveRecord属性,而c['place']
仅适用于后者。