18

Mam prosty model użytkownik z pojedynczej zagnieżdżonego Profile zasobu więc moim routes.rb mam:Szyny Zagnieżdżony Singular zasobów Routing

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

To generuje oczekiwanych tras:

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 Utworzono prostą metodę aktualizacji kontrolera, która aktualizuje model, a następnie przekierowuje po pomyślnej aktualizacji:

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 

Problem polega na tym, że po przesłaniu formularza formularz przekierowuje do witryny mydomain.com/users/4/profile.22, gdzie 22 jest identyfikatorem profilu. Najwyraźniej zdumiewa to kontrolerów, ponieważ routing interpretuje "22" jako format.

Moje pytanie brzmi, , w jaki sposób mogę to przekierować na mydomain.com/users/4/profile zamiast tego? Próbowałem następujące wariacje na rachunku redirect_to bez skutku, wszystkie one prowadzą do tego samego błędnego adresu URL:

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

Co więcej, za pomocą „user_profile_path (@user)” gdzie indziej produkuje prawidłowy adres URL.

Wszelkie pomysły? Och, i używam Rails 3.0.0 i Ruby 1.9.2, jeśli to pomaga.

Odpowiedz

11

Po obejrzeniu wydaje się, że formularz generujący aktualizację zawiera niepoprawny adres URL. Jeśli ktoś widzi ten problem, że to dlatego, że moja forma skonfigurować jako:

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

To spowodowało działanie formularz mieć nieprawidłowy adres URL (w formie wykraczającej powyżej). Zamiast tego użyłem i wszystko wydawało się działać.

+3

Mam również ten problem.Routing powinien być wystarczająco inteligentny, aby wiedzieć, że ma do czynienia z @profile, który jest liczbą pojedynczą i nie umieszcza identyfikatora w adresie URL. Mam nadzieję, że istnieje sposób obejścia tego problemu, ponieważ mam do czynienia z polimorficznym adresem URL z konieczności, ponieważ nie wiem, jaki jest jeden z obiektów nadrzędnych (w twoim przypadku nie wiedziałbym, że @user jest koniecznie Klasa użytkownika). –

+0

To jest długie stantowanie [bug in rails] (https://github.com/rails/rails/issues/1769) –

0

user_profile_path(@user) powinien być poprawny. Jesteś pewien, że powraca mydomain.com/users/4/profile.22?

+0

Tak, ale w celu podwójnego sprawdzenia dodałem instrukcję "puts" przed przekierowaniem i wydrukowałem poprawną ścieżkę ("/ users/4/profile"), nawet w następnej linii, przekierowanie z dokładnie ten sam kod wysłał mnie do wcześniej wspomnianego niepoprawnego adresu URL. –

+0

'tail -f' twój plik dziennika. Może robi więcej niż jedno przekierowanie. Tylko przeczucie! – scragz

4

należy przekierować do user_profile_path (@user), ponieważ jak swoich tras mówi ona:

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

Jeśli spojrzeć na niego uważnie, po czym widać, że jest tylko: user_id parametr potrzebny, ty to tylko @user na ścieżce.

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

byłoby poprawne, jeśli miał zasobów * s *: profile w routes.rb, wtedy również można wykorzystać jako ścieżkę w swoim przykładzie.

+1

Jestem w 100% pewny, że musisz użyć ścieżki ścieżka_profilu_użytkownika (@user). – m4risU

+0

Na szynach, jeśli wykonasz podwójne przekierowanie, będziesz musiał głośno płakać! ^^ "Może zostawiłeś tam coś jeszcze. Jaki jest twój obecny kod kontrolera? – m4risU

Powiązane problemy