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 %>