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

Tim*_*ss 1 ruby-on-rails

以下代码:

<% if params[:country].present? %>
  <%= link_to 'Clear Filters', users_path %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

工作正常,但是不必从我的模型中列出每个参数,有一种干燥的方法来重写上面的代码 if params[any].present?

我试过以下没有成功:

if params.present? 
if params.any? 
if params[].present? 
if params[''].present?
unless params.empty? 
Run Code Online (Sandbox Code Playgroud)

ale*_*tet 5

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

<%= link_to_if params[:country].present?, 'Clear Filters', users_path %>
Run Code Online (Sandbox Code Playgroud)

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

<%= link_to_if params.any?, 'Clear Filters', users_path %>
Run Code Online (Sandbox Code Playgroud)

当然,你的params变量上还有一些项目,比如控制器等,如果你有一组参数可以检查你总能做到:

<%= link_to_if (params.keys & filters).empty?, 'Clear Filters', users_path %>
Run Code Online (Sandbox Code Playgroud)

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

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

# helpers/users_helper.rb
def filters
  ['country', 'height', 'age']
end
Run Code Online (Sandbox Code Playgroud)

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

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

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