Ruby on rails 基于参数的回路设置困难
这是我的控制器:Ruby on rails 基于参数的回路设置困难,ruby-on-rails,ruby,ruby-on-rails-3,Ruby On Rails,Ruby,Ruby On Rails 3,这是我的控制器: def sedomain @domain = params[:domain] @virksomhed = Virksomhed.find(:all) end Virksomhed有一个域,域属于Virksomhed 我试图实现的是基于参数在域表中的所有行中循环 下面是dk域页面的一个示例。它很好用 <% @virksomhed.each do |virk| %> <tr> <td><%= virk.navn %
def sedomain
@domain = params[:domain]
@virksomhed = Virksomhed.find(:all)
end
Virksomhed有一个域,域属于Virksomhed
我试图实现的是基于参数在域表中的所有行中循环
下面是dk域页面的一个示例。它很好用
<% @virksomhed.each do |virk| %>
<tr>
<td><%= virk.navn %></td>
<td><%= virk.domain.dk %> kr.</td>
<td><%= virk.domain.dkf %></td>
<td><%= virk.domain.dko %></td>
</tr>
<% end %>
韩元。
但我想让它充满活力:
<% @virksomhed.each do |virk| %>
<tr>
<td><%= virk.navn %></td>
<td><%= virk.domain.@domain %> kr.</td>
<td><%= virk.domain.@domain %></td>
<td><%= virk.domain.@domain %></td>
</tr>
<% end %>
韩元。
但是我有一个语法错误。我还认为这是一个糟糕的解决方案,因为用户可以通过params访问域表中的其他列 不能像这样取消引用变量。您的意思是使用
send
:
<td><%= virk.domain.send(@domain) %> kr.</td>
@塔德曼的回答很好,但我想加上我的两分钱。正如@Emily所说,您可以将您的白名单域作为一个集合存储在一个常量中:
require 'set'
DOMAINS = Set.new( %W{dk dkf dko} )
据我所知,您的参数[:domain]
可以是数组或字符串。要检查域是否被列入白名单,您可以执行以下操作:
# ...
@domains= check_domains( params[:domain] )
# ...
def check_domains( dom )
case dom
when Array
dom if dom.to_set.subset?( DOMAINS )
else
[dom] if DOMAINS.include?( dom )
end
dom ||= []
end
然后在您看来(或者可能作为某个助手/部分):
韩元。
可以创建黑名单,而不是创建白名单。因为我的白名单会很长,但不是很漂亮。安全比漂亮更重要。如果您担心控制器代码中有一个很长的列表,请将它放在某个配置文件中。
# ...
@domains= check_domains( params[:domain] )
# ...
def check_domains( dom )
case dom
when Array
dom if dom.to_set.subset?( DOMAINS )
else
[dom] if DOMAINS.include?( dom )
end
dom ||= []
end
<% if @domains.any? %>
<% @domains.each do |domain| %>
<td><%= virk.domain.send(domain) %> kr.</td>
<% end %>
<% end %>