rails - 如果定义了collection_select选择的值?

时间:2011-01-15 18:59:28

标签: ruby-on-rails ruby-on-rails-3

我有以下内容:

<%= f.collection_select :role_id, roles, :id, :name, :prompt => true, :selected => 2 %>

问题是,如果值@ permission.role_id为零,我只希望选择的值为2。

所以我试过了:

<%= f.collection_select :role_id, roles, :id, :name, :prompt => true, {:selected => 2 if @permission.role_id.nil?} %> 

但这让Rails生气了。如何根据单独的变量是否为零来创建条件选择值?

由于

5 个答案:

答案 0 :(得分:25)

好吧我想我会在2分钟内感到愚蠢,但是

<%= f.collection_select :role_id, roles, :id, :name, prompt: true, @permission.role_id ? {} : {selected: 2 } %>

您的解决方案无效的原因是您的if可以返回nil,因此看起来像这样:

<%= f.collection_select :role_id, roles, :id, :name, :prompt => true, {nil} %>

{nil}是语法错误

答案 1 :(得分:9)

虽然三元运算符的公认解决方案有效,但我认为它不像以下解决方案那么可读:

<%= f.collection_select :role_id, roles, :id, :name, :prompt => true, :selected => @permission.role_id || 2 %>

答案 2 :(得分:3)

把它放在你的助手

def selected(permission)
  if permission.role_id.nil?
    return 2
  else
    .....
  end
end

并在您的视图中

<%= f.collection_select :role_id, roles, :id, :name, :prompt => true, :selected => selected(@permission) %>

答案 3 :(得分:0)

问题在于你不能拥有if在那个位置。所以第一个解决方案,虽然有点难看,但是如下所示:

<% if @permission.role_id.nil? %>
  <%= f.collection_select :role_id, roles, :id, :name, :prompt => true, {:selected => 2} %>
<% else %>
  <%= f.collection_select :role_id, roles, :id, :name, :prompt => true %>
<% end %>

答案 4 :(得分:0)

我发现@ ecoologic的答案并不适合我,因为ruby试图将哈希解释为最后一个参数的关键,而不是在哈希中查找值。

解决方案是使用&#39; splat&#39;。但是splats似乎不能以内联格式工作,所以我使用了以下内容:

<% selected = @permission.role_id ? {} : {selected: 2 } %>
<%= f.collection_select :role_id, roles, :id, :name, prompt: true, **selected %>