是否可以询问是否有任何参数?

时间:2016-09-14 16:16:32

标签: ruby-on-rails

以下代码:

<% if params[:country].present? %>
  <%= link_to 'Clear Filters', users_path %>
<% end %>

正常工作,但是不必从我的模型中列出每个参数,而是将干扰方法重写为if params[any].present?

我尝试了以下但没有成功:

if params.present? 
if params.any? 
if params[].present? 
if params[''].present?
unless params.empty? 

2 个答案:

答案 0 :(得分:5)

params 是一个哈希值,因此您可以在其中使用任何哈希方法,例如任意?,或空?,您可以访问键和值也是如此,但rails有一个帮助条件链接link_to_if所以你的例子可能是这样的:

<%= link_to_if params[:country].present?, 'Clear Filters', users_path %>

或者如果您想知道是否有任何参数

<%= link_to_if params.any?, 'Clear Filters', users_path %>

当然,你的params变量上还有一些项目,例如 controller 等,如果你有一组params来检查你可以一直这样做:

<%= link_to_if (params.keys & filters).empty?, 'Clear Filters', users_path %>

这是& operator的作用。对于过滤器,您可以使用任何选项将数据传递给视图以获取它(控制器上的实例变量(不推荐,因为它不是逻辑的一部分)将方法放在帮助器上(可以工作)或模型上的常量(我更喜欢)

如果您选择将其保留在帮助器上,则可以将其添加到 users_helper ,这是有道理的,因为它将帮助布局您的视图,这绝对是帮助者的原因为:

# helpers/users_helper.rb
def filters
  ['country', 'height', 'age']
end

但是你可能再次在其他地方使用这些值,特别是你实际过滤值的地方我假设模型有责任过滤那些值,所以你可以把它放在你的模型中它可能就像这样:

# models/user.rb
...
FILTERS = ['country', 'height', 'age']
...

#your view
<%= link_to_if (params.keys & User::FILTERS).empty?, 'Clear Filters', users_path %>

答案 1 :(得分:2)

Rails router使用信息请求路径构建params。除了你添加的params(显式来自form_for),params还包括包含用于呈现视图的控制器和操作的键。

例如,如果您有博客并且正在呈现路径/articles/1,则参数将包括:

{
  controller: "articles",
  action: "show",
  id: 1
}

所以params.present?params.any?实际上正在按预期工作,因为你的参数实际上并非空。

要回答您的问题,您可以采取一些方法来干掉代码。您可以使用写helper method来检查params以查看是否存在位置(以及您关心的任何其他属性),然后在视图中的条件中使用它。