2009-10-05 8 views
0

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

Répondre

0

Dans l'un d'entre eux vous avez une liste d'utilisateurs et l'autre une liste d'options.
Donc, même si pour l'instant, vos deux pages ont la même fonctionnalité, elles sont indépendantes l'une de l'autre et vous voudrez peut-être changer les choses pour un seul dans le futur. Donc, je les garderais distinct avec deux actions javascript différentes. Cela vous permettra de les faire évoluer plus facilement sur leur chemin différent.

De toute façon, comme vous pouvez le voir, ils sont déjà très différents. Vous avez deux partiels différents et deux ID de tags html différents.
Essayer d'avoir le même code pour eux deux ici me semble assez confus.

Alors oui, je créerais deux actions, une pour la liste des utilisateurs et une pour leurs options.

+0

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