Je ne suis pas sûr d'avoir manqué un modèle de conception connu, mais je continue de me heurter au problème suivant avec les routes RESTful Rails.Séchage des routes et des réponses javascript
Dans mon exemple, j'ai un contrôleur d'utilisateur qui peut répondre au format javascript (: js). La réponse par défaut renseigne un élément avec une liste des utilisateurs paginés:
# /app/controllers/users_controller.rb
class UsersController < ActionController
def index
@users = User.paginate(:all, :page => params[:page], :conditions => ['name ILIKE ?', params[:name])
respond_to do |format|
format.html
format.js
end
end
end
Le modèle RJS correspondant ressemblerait à ceci:
# /app/views/users/index.js.rjs
page.replace_html :users, :partial => 'users'
Cela fonctionne bien, me permettant d'effectuer des recherches AJAX sur les utilisateurs. Cependant, dans une autre partie de mon site (disons le formulaire d'édition) je voudrais effectuer une recherche AJAX des utilisateurs, mais mettre à jour un ensemble d'options '' select '' ou effectuer une autocomplétion en ligne plutôt que de mettre à jour la page #utilisateurs élément, par exemple
# /app/views/users/edit.html.erb
<%= f.text_field :name %>
$('#user_name').autocomplete({url: '/users', data: 'name=value', ...})
Ma question est quelle serait la meilleure façon DRY d'y parvenir? Je ne pense pas que je devrais avoir besoin de créer une nouvelle action de contrôleur pour correspondre à la vue différente, car cela impliquerait de répéter le code de recherche. La seule solution que je suis venu à travers est à ce jour pour construire des conditions javascript dans mon assistant RJS:
# /app/views/users/index.js.rjs
page << "if($('#users').length > 0)"
page.replace_html :users, :partial => 'users'
page << "else"
page.replace_html :user_options, :partial => 'user_options_for_select'
Cela se sent très fragile, et impur Rails. Ai-je manqué quelque chose dans la façon dont je peux répondre avec différentes vues en fonction du contrôleur appelant?
Appréciez toute aide! Chris
Merci pour votre réponse. Je ne suis pas sûr si l'exemple est clair, mais dans les deux cas, je retournerais juste une liste de noms d'utilisateurs. Dans le premier exemple, cela remplirait la liste paginée; dans la seconde, il peuplerait la liste
Les vues sont conçues pour afficher les choses différemment. Si vous avez deux fois les mêmes données mais que vous voulez les afficher deux fois différemment, la bonne façon de faire n'est pas de faire une condition. Mais faire deux vues. –
Que diriez-vous de déplacer la condition dans la vue; Serait-ce une bonne pratique? Je pense quelque chose dans le sens de rendre une vue différente de la même action en fonction de la condition, par exemple: render (condition? View_one: view_two) –