2016-01-29 1 views
1

J'ai un filtre de classe qui comprend ActiveModel et se compose de deux dates:Rails: Cartographie une date à partir des paramètres de formulaire dans ActiveModel objet

class MealFilter 
    include ActiveModel::Model 

    attribute :day_from, Date 
    attribute :day_to, Date 
end 

Ce modèle est rendu en une forme comme suit:

<%= form_for(@filter) do |f| %> 
     <div class="form-group form-group--date"> 
     <%= f.label :day_from %> 
     <%= f.date_select :day_from %> 
     </div> 
     <div class="form-group form-group--date"> 
     <%= f.label :day_to %> 
     <%= f.date_select :day_to %> 
     </div> 
    <% end %> 

le problème est maintenant, lorsque le formulaire est soumis, il envoie ces paramètres au contrôleur:

{"utf8"=>"✓", "meal_filter"=>{"day_from(1i)"=>"2016", "day_from(2i)"=>"1", "day_from(3i)"=>"29", "day_to(1i)"=>"2016", "day_to(2i)"=>"1", "day_to(3i)"=>"30"}, "commit"=>"Filter"} 

I Extrait les valeurs via les paramètres du contrôleur:

def meal_filter_params 
    if params.has_key? :meal_filter 
    params.require(:meal_filter).permit(:day_from, :day_to) 
    end 
end 

si je cède maintenant la params[:meal_filter] à ma MealFilter classe avec @filter = MealFilter.new(meal_filter_params), mes champs de date ne sont pas mis à jour correctement. Il semble que les pièces 1i, 2i, 3i ne soient pas correctement affectées aux dates.

Toutefois, cela fonctionne très bien si vous utilisez une classe ActiveRecord.

Est-ce que je ne comprends pas? Est-ce que quelqu'un sait, où cette cartographie magique est implémentée sinon dans ActiveModel::Model?

+0

Qu'est-ce que 'meal_filter_params'? Obtenez-vous un avertissement de paramètres forts dans votre journal Rails peut-être? – rossta

+0

C'est une méthode sur le contrôleur qui retourne uniquement les parametres meal_filter autorisés ... J'ai mis à jour la description pour clarifier cela. Un avertissement de paramètre n'existe pas dans ma console. – tomraithel

+0

Et que voulez-vous dire par "pas mis à jour correctement"? Comment vous vérifiez que c'est mis à jour? – rossta

Répondre

0

Ok, trouvé une solution. Ce dont j'avais besoin était le MultiparameterAssignment qui est actuellement implémenté dans ActiveRecord mais pas dans ActiveModel. Pour autant que je puisse le voir, il existe une demande d'extraction ouverte (https://github.com/rails/rails/pull/8189) qui devrait résoudre ce problème.

Mais en attendant, un gars intelligent a écrit un module qui peut être inclus dans le modèle: https://gist.github.com/mhuggins/6c3d343fd800cf88f28e

Tout ce que vous devez faire est d'inclure la préoccupation et définir une méthode class_for_attribute qui retourne la classe où votre attribut devrait être mappé à - dans mon cas Date.