以下代码:
<% 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)
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)