Les Rails n'a pas pu convertir sans permission paramètres de hachage
Je suis en train de mettre en œuvre une simple recherche et de tri pour ma webapp. Je suis à la suite de la railscast et ce railscast.
Ma demande d'assistance pour sortable fonction de qui je suis en utilisant comme lien est:
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
Je suis dans la vue. Dans le contrôleur, je suis en utilisant la liste blanche:
@listingssearch.where(:vehicletype => 'Car').order(sort_column + " " + sort_direction).paginate(:page => params[:page], :per_page => 30)
Privé Méthodes de nettoyage:
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
J'ai essayé d'utiliser la fusion dans la méthode privée:
(Listing.column_names + params) but its not working
Pour les méthodes d'assistance j'obtiens un message d'erreur quand j'essaie de fournir la recherche params pour le lien de tri: impossible de convertir non autorisé paramètres de hachage
Il montre l'erreur est de fusionner
link_to title, params.merge(:sort => column, :direction => direction, :page => nil), {:class => css_class}
La dans le cas contraire autour des œuvres amende:
<%= 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 %>
Ma question est Comment faire pour conserver de recherche params dans le tri des méthodes d'assistance dans les rails 5? Ce que je fais de mal?
OriginalL'auteur Saurav Prakash | 2017-09-04
Vous devez vous connecter pour publier un commentaire.
Dans les Rails 5,
ActionController::Parameters
plus hérite deHash
, dans une tentative pour décourager les gens d'utiliserHash
méthodes liées à la sur les paramètres de la requête, sans explicitement le filtrage.Dans le cadre de ce pull request, qui a été reporté dans les Rails 5.1 et en partie sur des Rails 5.0, une exception est levée si vous essayez d'appeler
to_h
sur les paramètres de l'objet sans appelpermit
.Appel
merge
sur l'originalparams
objet (params.merge(:sort => column, :direction => direction, :page => nil)
) retourne une nouvelleActionController::Parameters
objet avec le mêmepermitted
statut (qui est,permit
n'a pas été appelé sur elle). Lelink_to
méthode, puis finit par appelerto_h
sur cet objet, ce qui soulève l'exception.Si vous savez quels sont les paramètres qui doivent être autorisés dans le lien, vous pouvez appeler
permit
avec ceux qui sont énumérés.Si vous ne savez pas quels sont les paramètres qui pourraient être inclus dans le lien, puis vous pouvez utiliser
request.parameters.merge(...)
(comme mentionné dans cette réponse) ouparams.to_unsafe_h.merge(...)
. Ces deux fondamentalement contourner le fort-les paramètres de protection lors de la création du lien. Par défaut, ce qui signifie que tous les paramètres dans la demande initiale serait également apparaître dans l'URL du lien. Je suppose que ce n'est pas trop risqué dans cette situation particulière, mais si vous avez le code d'ailleurs qui n'a pas de désinfecter les paramètres correctement, cela pourrait rendre la situation un peu moins bien.J'ai élargi la réponse un peu d'inclure des exemples et également d'apporter une légère correction à ce que la cause de l'exception. Ne fait que répondre à votre question?
Merci! En passant params explicitement aidera à protéger contre les injections sql. Ce serait la bonne façon de procéder de la demande.params. Bien que les deux œuvres.
OriginalL'auteur Max
vous pouvez essayer d'utiliser le demande.les paramètres.de fusion, ci-dessous un exemple de ton code ci-dessus
OriginalL'auteur widjajayd
Vous pouvez utiliser ce hack:
Je pense que les rails, les développeurs de les restreindre, quand ils savent que c'est la voie à l'utilisation non autorisee des paramètres. 🙂
OriginalL'auteur Ghazi
Je crois que si vous passez à la colonne des permis, il devrait vous permettre de travailler à nouveau!
OriginalL'auteur Mike Langston