Sau*_*ash 26 ruby sorting parameters ruby-on-rails search-form
我正在尝试为我的webapp实现一个简单的搜索和排序.我正在关注railscast和这个railscast.
我作为链接使用的可排序函数的应用程序帮助程序是:
def sortable(column, title = nil)
title ||= column.titleize
css_class = column == sort_column ? "current #{sort_direction}" : nil
direction = column == sort_column && sort_direction == "asc" ? "desc" : "asc"
link_to title, params.merge(:sort => column, :direction => direction, :page => nil), {:class => css_class}
end
Run Code Online (Sandbox Code Playgroud)
我在视图中使用这些.在控制器中我使用白名单:
@listingssearch.where(:vehicletype => 'Car').order(sort_column + " " + sort_direction).paginate(:page => params[:page], :per_page => 30)
Run Code Online (Sandbox Code Playgroud)
私人消毒方法:
private
def sort_column
Listing.column_names.include?(params) ? params[:sort] : "rateperhour"
end
def sort_direction
%w[asc desc].include?(params[:direction]) ? params[:direction] : "asc"
end
Run Code Online (Sandbox Code Playgroud)
我尝试在私有方法中使用merge:
(Listing.column_names + params) but its not working
Run Code Online (Sandbox Code Playgroud)
对于辅助方法,当我尝试向排序链接提供搜索参数时,我收到错误:无法将未经许可的参数转换为哈希
它显示错误是合并
link_to title, params.merge(:sort => column, :direction => direction, :page => nil), {:class => css_class}
Run Code Online (Sandbox Code Playgroud)
其他方面工作正常:
<%= bootstrap_form_for listings_path, :method => 'get' do %>
<%= hidden_field_tag :direction, :value => params[:direction] %>
<%= hidden_field_tag :sort,:value => params[:sort] %>
<div class= "col-sm-12 col-lg-12 col-md-12" style = "margin: auto;">
<h6 style = "color:#7C064D;"><strong> PICK A DATE <span class="glyphicon glyphicon-calendar"></span></strong>
<%= date_field_tag :startdate, params[:startdate], placeholder: 'DATE' %>
</h6>
</div>
<div class= "col-sm-12 col-lg-12 col-md-12" style = "margin: auto;">
<p>
<%= text_field_tag :near, params[:near], placeholder: ' Destination' %>
<%= text_field_tag :radius, params[:radius], placeholder: ' Search Radius' %>
</p>
</div>
<div class= "col-sm-12 col-lg-12 col-md-12" style = "margin: auto;">
<p>
<%= text_field_tag :min, params[:min], placeholder: ' Minimum Rate Per Hour' %>
<%= text_field_tag :max, params[:max], placeholder: ' Maximum Rate Per Hour' %>
</p>
</div>
<div class= "col-sm-12 col-lg-12 col-md-12" style = "margin-top: 10px;">
<%= submit_tag "Search", class: "btn btn-info", style: "width: 40%; background-color: #E20049; border: #e20049;" %>
<%= link_to 'View All', root_path, class: "btn btn-info", style: "width: 40%; background-color: #E20049; border: #e20049;" %>
</div>
<!-- <div class= "col-sm-6 col-lg-6 col-md-6" style = "margin-top: 10px;">
</div> -->
<% end %>
Run Code Online (Sandbox Code Playgroud)
我的问题是如何在rails 5中的sort helper方法中保持搜索参数?我做错了什么?
Max*_*Max 56
在Rails 5中,ActionController::Parameters
不再继承Hash
,试图阻止人们Hash
在请求参数上使用相关方法而不明确过滤它们.
作为此拉取请求的一部分,如果您尝试to_h
在不调用的情况下调用参数对象,则会将其移植到Rails 5.1中并部分移植到Rails 5.0中permit
.
调用merge
原始params
对象(params.merge(:sort => column, :direction => direction, :page => nil)
)会返回一个ActionController::Parameters
具有相同permitted
状态的新对象(即,permit
尚未对其进行调用).link_to
然后该方法最终调用to_h
该对象,这会引发异常.
如果您知道链接中应允许哪些参数,则可以permit
使用列出的参数进行调用.
params.permit(:param_1, :param_2).merge(:sort => column, :direction => direction, :page => nil)
# OR
params.merge(:sort => column, :direction => direction, :page => nil).permit(:param_1, :param_2, :sort, :direction, :page)
Run Code Online (Sandbox Code Playgroud)
如果您不知道链接中可以包含哪些参数,那么您可以使用request.parameters.merge(...)
(如本答案中所述)或params.to_unsafe_h.merge(...)
.在创建链接时,这两者基本上都绕过了强参数保护.默认情况下,这意味着原始请求中的任何参数也会出现在链接URL中.我想在这种特殊情况下风险并不大,但如果你在其他地方有代码没有正确清理参数,这可能会使情况变得更糟.
Gha*_*azi 13
您可以使用此技巧:
params.to_enum.to_h
Run Code Online (Sandbox Code Playgroud)
我认为Rails开发人员会在知道使用非许可参数的方式时对其进行限制。:)
您可以尝试使用request.parameters.merge,以下是上面代码的示例
<%= link_to title, listings_path(request.parameters.merge({:sort => "column", :direction => "direction", :page => nil})), :class => "form-control css_class" %>
Run Code Online (Sandbox Code Playgroud)
Since no one suggested this. So here is one way that we can use params.to_unsafe_hash
which will convert the strong parameters to a hash.
For example:
(byebug) values
<ActionController::Parameters {"country"=>"RU", "city"=>"Moscow", "street"=>"1 First Street", "zip"=>"123456"} permitted: false>
(byebug) values.to_unsafe_hash
{"country"=>"RU", "city"=>"Moscow", "street"=>"1 First Street", "zip"=>"123456"}
Run Code Online (Sandbox Code Playgroud)
小智 5
我相信如果您通过专栏许可它应该让您再次工作!
def sortable(column, title = nil)
title ||= column.titleize
css_class = column == sort_column ? "current #{sort_direction}" : nil
direction = column == sort_column && sort_direction == "asc" ? "desc" : "asc"
link_to title, params.permit(column).merge(sort: column, direction: direction, page: nil), { class: css_class }
end
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
18502 次 |
最近记录: |