Rails,从select中删除NIL属性,可能吗?

时间:2014-09-25 23:07:00

标签: ruby-on-rails select null

每个人,我都是铁杆新手。提前感谢您的帮助。
我在哪里:
用户正在尝试创建新的"挑战",其中我使用其他模型属性的所有实例列表中的Select语句。
例如:
创建一个挑战,我可以选择所有用户中的一个城市'城市, 它有效。但由于city列不是用户的必需属性,因此某些用户citynil(未在其个人资料中更新)。

观察

我的选择下拉列表显示: 空白 空白 空白 堪萨斯 丹佛 空白 波士顿 等等...

  • 如何从下拉列表中删除空白选项?
  • 如何在下拉列表中显示,只有有效(非零)用户'城市?

这是选择

<div class="form-group">
  <%= f.select :challenge_city, User.all.collect{ |n| [n.user_city, n.id] }.insert(0, "Select a city for your challenge") %>
</div>

```

再次感谢。

2 个答案:

答案 0 :(得分:2)

此特定示例应在范围内处理,例如:

class User scope :with_city, -> { where('user_city IS NOT NULL') } end

然后用

调用它

User.with_city # => all users which have non-nil cities

作为旁注,此示例在视图代码中有太多逻辑。您应该考虑将该逻辑提取到控制器,装饰器或其他地方。

在控制器中: @challenge_options = User.with_city.collect { |n| ... }.insert {...}

在视图中: <%= f.select :challenge_city, @challenge_options %>

答案 1 :(得分:0)

我同意gdpelican您的观点包含太多逻辑。但是,由于你有一个列城市,你可以/应该将其进一步推向模型

您可以通过以下方式获取特定城市的所有用户:

User.find_all_by_city some_city_name

或者如果你只想快速解决问题,你可以“紧凑”#34;您的收集块返回的数组

<%= f.select :challenge_city, User.all.collect{ |n| [n.user_city, n.id] if n.user_city }.compact.insert(0, "Select a city for your challenge") %>

将删除数组中的nil元素