2012-06-10 5 views
0

J'ai une ressource d'espace de noms, mais seulement dans les répertoires du contrôleur. Ainsi, dans routes.rb:Rails: comportement bizarre dans la forme_pour

namespace :admin do 
    resources :user 
end 

qui signifie ceci:

admin_user_index GET /admin/user(.:format)     admin/user#index 
       POST /admin/user(.:format)     admin/user#create 
    new_admin_user GET /admin/user/new(.:format)    admin/user#new 
edit_admin_user GET /admin/user/:id/edit(.:format)   admin/user#edit 
     admin_user GET /admin/user/:id(.:format)    admin/user#show 
       PUT /admin/user/:id(.:format)    admin/user#update 
       DELETE /admin/user/:id(.:format)    admin/user#destroy 

Tout fonctionne bien, sauf l'action « nouveau » et c'est bizarre puisque le rendu _form est le même dans le « modifier » l'action et cela fonctionne bien. Ceci est mon contrôleur au sein de répertoire admin:

class Admin::UserController < ApplicationController 
# GET /users 
def index 
    @users = User.all 
end 

# GET /users/1 
def show 
    @user = User.find(params[:id]) 
end 

# GET /users/new 
def new 
    @user = User.new 
end 

# GET /users/1/edit 
def edit 
    @user = User.find(params[:id]) 
end 

# POST /users 
def create 
    @user = User.new(params[:user]) 
    respond_to do |format| 
    if @user.save 
     format.html { redirect_to @user, notice: 'User was successfully created.' } 
    else 
     format.html { render action: "new" } 
    end 
    end 
end 

# PUT /users/1 
def update 
    @user = User.find(params[:id]) 
    respond_to do |format| 
    if @user.update_attributes(params[:user]) 
     format.html { redirect_to [:admin ,@user], notice: 'User was successfully updated.' } 
    else 
     format.html { render action: "edit" } 
    end 
    end 
end 

end 

Et ceci est la première ligne de la forme qui provoque l'erreur: méthode non définie admin_users_path »

<%= form_for [:admin, @user] do |f| %> 

Je ne peux pas comprendre où l'erreur est. Un conseil?

Répondre

2

Les conventions Rails indiquent que les contrôleurs doivent être pluralisés. Si vous ne souhaitez pas suivre cette convention, vous pouvez définir l'URL dans la balise form_for avec: url =>admin_user_path(@user). Je recommande fortement d'utiliser les conventions Rails, sinon vous serez constamment aux prises avec des problèmes comme celui-ci où vous devez remplacer les valeurs par défaut.

Vous pouvez facilement mettre à jour ce code pour utiliser les conventions Rails en changeant votre classe contrôleur Admin::UsersController et la route vers resources :users

+0

Ok ça marche. Mais pourquoi? Je suis très nouveau à Ror et je ne comprends pas pourquoi dans l'action d'édition cela a bien fonctionné et dans le nouveau ne l'a pas fait? Tout était pareil n'était pas? Merci en passant – Barbared

+0

C'est un peu difficile à expliquer dans un commentaire, mais Rails fait essentiellement certaines hypothèses sur la façon dont vos URL sont construites sur la base du concept REST. Les nouveaux objets sont créés en POSTing sur l'itinéraire pluralisé et les objets sont édités en METTANT en route la route singulière. Puisque vous avez seulement eu une route singulière, c'est pourquoi l'édition a fonctionné. Je recommande fortement de lire http://guides.rubyonrails.org/routing.html car cela explique le routage beaucoup mieux que je peux. –

+0

Ok merci encore – Barbared