18

Ho un semplice modello User con una risorsa Profilo nidificato singolare quindi nel mio routes.rb ho:Rails nidificati Singolare risorse Routing

resources :users do 
    resource :profile, :only => [:edit, :update, :show] 
end 

Questo genera i percorsi previsti:

edit_user_profile GET /users/:user_id/profile/edit(.:format) {:action=>"edit", :controller=>"profiles"} 
    user_profile GET /users/:user_id/profile(.:format)  {:action=>"show", :controller=>"profiles"} 
    user_profile PUT /users/:user_id/profile(.:format)  {:action=>"update", :controller=>"profiles"} 

I 'Ho creato un metodo di aggiornamento semplice controller che aggiorna il modello e poi reindirizza su aggiornamento riuscito:

def update 
    @profile = Profile.find_by_user_id(params[:user_id]) 
    @user = User.find_by_id(params[:user_id]) 

    respond_to do |format| 
    if @profile.update_attributes(params[:profile]) 
     format.html { redirect_to(user_profile_path(@user, @profile), :notice => 'Profile was successfully updated.') } 
    else 
     # ... 
    end 
    end 
end 

Il problema è che una volta inviato il modulo, il modulo reindirizza a mydomain.com/users/4/profile.22 dove 22 risulta essere l'id del profilo. Chiaramente questo confonde i controller poiché il routing interpreta il '22' come formato.

La mia domanda è, come faccio a reindirizzare a mydomain.com/users/4/profile? ho provato le seguenti variazioni sul conto redirect_to a nessun effetto, tutti risultato nella stessa URL non corretto:

redirect_to(user_profile_path(@user), ...) 
redirect_to(user_profile_path(@user, @profile), ...) 
redirect_to([@user, @profile], ...) 
redirect_to(@profile, ...) 

Cosa c'è di più, usando 'user_profile_path (@user)' produce altrove l'URL corretto.

Qualche idea? Oh, e sto usando Rails 3.0.0 e Ruby 1.9.2 se questo aiuta.

risposta

11

Dopo essersi guardati attorno, sembra che il modulo che ha generato l'aggiornamento avesse un URL errato. Se qualcuno sta vedendo questo problema, è perché avevo la mia forma impostato come:

form_for [@user, @profile] do |f| ... 

Ciò ha causato l'azione modulo per avere l'URL non corretto (di forma offendere sopra). Invece, ho usato

form_for @profile, :url => user_profile_path(@user) do |f| ... 

e tutto sembrava funzionare.

+3

Anche io sto avendo questo problema.Il routing dovrebbe essere abbastanza intelligente da sapere che si tratta di @profile che è singolare e non inserire l'id nell'URL. Spero che ci sia un modo per ovviare a questo perché ho a che fare con url polimorfi per necessità perché non so quale classe uno degli oggetti padre sia (nel tuo caso non saprei che @user è necessariamente un Classe utente). –

+0

Questo è un lungo stanting [bug in rails] (https://github.com/rails/rails/issues/1769) –

0

user_profile_path(@user) deve essere corretto. Sei sicuro che uno sta restituendo mydomain.com/users/4/profile.22?

+0

Sì, ma per ricontrollare ho aggiunto un'istruzione "puts" prima del reindirizzamento e ho stampato il percorso corretto ('/ users/4/profile'), anche se la riga successiva, il reindirizzamento con il lo stesso identico codice mi ha inviato all'URL errato prima menzionato. –

+0

'tail -f' il tuo file di registro. Forse sta facendo più di un reindirizzamento. Solo un sospetto! – scragz

4

Si dovrebbe reindirizzare a user_profile_path (@user) poiché, come i percorsi dice che è:

/users/:user_id/profile(.:format) 

Se si guarda da vicino, poi si vedrà, che ci sia solo: il parametro user_id bisogno, tu è solo @user in un percorso.

/users/:user_id/profile/:id(.:format) 

Sarebbe corretto se aveste delle risorse * s *: profili in routes.rb, allora così si potrebbe utilizzare il percorso come nel tuo esempio.

+1

Sono sicuro al 100% che tu debba usare user_profile_path (@user). – m4risU

+0

In binari se esegui il reindirizzamento doppio, allora lo farai piangere forte! ^^ "Forse hai lasciato qualcos'altro. Qual è il tuo attuale codice controller? – m4risU