2010-12-13 57 views
0

Je voudrais déplacer le suivant de mon point de vue dans l'aide associée du modèle:refactoring Rails 3 vues - logiques de déplacement à <model> _helper

<%= link_to_unless params[:aged]=='0', "0", jobs_path(:aged => '0', :sort=>params[:sort],:dir=>params[:dir],:fav=>params[:fav]) %> | 
<%= link_to_unless params[:aged]=='30', "30", jobs_path(:aged => '30', :sort=>params[:sort],:dir=>params[:dir],:fav=>params[:fav]) %> | 
<%= link_to_unless params[:aged]=='60', "60", jobs_path(:aged => '60', :sort=>params[:sort],:dir=>params[:dir],:fav=>params[:fav]) %> | 
<%= link_to_unless params[:aged]=='90', "90", jobs_path(:aged => '90', :sort=>params[:sort],:dir=>params[:dir],:fav=>params[:fav]) %> 

J'ai essayé, mais il provoque une erreur IDENTIFIER INATTENDU (clairement Je dois concaténer les résultats de l'link_to_unless au « | »):

link_to_unless params[:aged]=='0', "0", users_path(:aged=>'0',:sort=>params[:sort],:dir=>params[:dir],:fav=>params[:fav]) | 
link_to_unless params[:aged]=='30', "30", users_path(:aged=>'30',:sort=>params[:sort],:dir=>params[:dir],:fav=>params[:fav]) | 
link_to_unless params[:aged]=='60', "60", users_path(:aged=>'60',:sort=>params[:sort],:dir=>params[:dir],:fav=>params[:fav]) | 
link_to_unless params[:aged]=='90', "90", users_path(:aged=>'90',:sort=>params[:sort],:dir=>params[:dir],:fav=>params[:fav]) 

Il semble que je dois insérer les résultats de ces méthodes d'aide dans le flux HTML, mais je ne suis pas certain de la meilleure approche .

Maintenant que Rails 3 inclut tous les helpers tout le temps (helpers: all), est-il possible d'indiquer à la vue d'un modèle d'utiliser uniquement l'assistant associé au modèle? À ce stade, j'ajoute le nom du modèle dans le nom de la fonction - par exemple, 'jobs_sorted_column'.

** modifier **

refactorisé

jobs_helper:

def posted_filter(bucket) 

    link_to_unless params[:posted]==bucket, bucket, jobs_path(:posted =>bucket, :starting=>params[:starting],:sort=>params[:sort],:dir=>params[:dir]) 

    end 

vue:

[ <% ['0','30','60','90'].each do |bucket| %> 
    <%= posted_filter(bucket) %> | 
<% end %> ] 

Questions:

  • La sortie résultante ressemble à [0 | 30 | 60 | 90 | ] existe-t-il une solution simple pour supprimer le 4ème '|'?
  • Il semble qu'il y aurait une manière plus élégante de passer les paramètres à la route, y compris la valeur 'over-ridden' (: posted => bucket, dans mon exemple).

Répondre

1

Vous pouvez le faire encore mieux:

def posted_filters(*args) 
    args.collect { |bucket| 
    link_to_unless(params[:posted]==bucket, bucket, jobs_path(:posted =>bucket, :starting=>params[:starting],:sort=>params[:sort],:dir=>params[:dir])) 
    }.join(' | ').html_safe 
end 

Et dans votre code de la vue:

[ <%= posted_filters(0, 30, 60, 90) %> ] 
+0

J'aime l'approche, mais quand j'ajoute le code à l'assistant associé, le résultat est une chaîne de texte qui est échappée HTML, plutôt que des liens. Ai-je raté quelque chose? – craig

+0

l'a corrigé pour forcer html_safe. devrait fonctionner maintenant – changelog

+0

non. ressemble toujours à [0 | ... – craig

3

Essayez d'utiliser collect et join, quelque chose comme:

<%= ['0','30','60','90'].collect{ |x| "#{posted_filter(x)}" }.join(' | ') %> 

Voir: Array #collect

+0

merci pour votre réponse. – craig