2011-01-06 7 views
3

私はバニティURLを持つアプリを持っており、ユーザーに属性を更新できるように苦労しています。編集フォームは正しく読み込まれていますが、フォームが送信された後、updateメソッドを実行する代わりに、railsはrootに再ルーティングされます。なぜこれが起こっている正確にわからない....編集フォームのルーティング - 更新更新の送信#updateの代わりに#showメソッドを実行します

# users_controller 
    def edit 
    @user = User.find(params[:id]) 
    end 

    def to_param # overridden 
    username.parameterize 
    end 

    def update 
     @user = User.find(params[:id]) 
     if @user.update_attributes(params[:user]) 
     redirect_to user_url(current_user.username), :flash => { :success => "success" } 
     else 
     redirect_to user_url(current_user.username), :error => { :error => "shit" } 
     end 
    end 

ルート

resources :users do 
    resources :friends 
    end 

    match '/:username' => 'users#show', :as => "user" 

フォーム

<%= form_for @user do |form| %> 
<%= render 'shared/error_messages', :object => form.object %> 
<div class="form"> 
    <p> <%= form.label :description, "Message to friends" %> <br /> 
    <%= form.text_area :description %> </p> 

    <%= form.submit %> 
</div> 
<% end %> 

のdevのログ

Started GET "https://stackoverflow.com/users/1/edit" for 127.0.0.1 at Wed Jan 05 19:07:28 -0500 2011 
    Processing by UsersController#edit as HTML 
    Parameters: {"id"=>"1"} 
    User Load (0.2ms) SELECT "users".* FROM "users" WHERE ("users"."id" = 1) LIMIT 1 
Rendered shared/_error_messages.html.erb (0.6ms) 
ApplicationController::current_user 
ApplicationController::current_user_session 
    CACHE (0.0ms) SELECT "users".* FROM "users" WHERE ("users"."id" = 1) LIMIT 1 
    CACHE (0.0ms) SELECT "users".* FROM "users" WHERE ("users"."id" = 1) LIMIT 1 
ApplicationController::current_user_session 
ApplicationController::current_user 
ApplicationController::current_user 
Rendered users/edit.html.erb within layouts/application (27.6ms) 
Completed 200 OK in 53ms (Views: 38.7ms | ActiveRecord: 0.3ms) 


    Started POST "/1" for 127.0.0.1 at Wed Jan 05 19:08:06 -0500 2011 
     Processing by UsersController#show as HTML 
     Parameters: {"commit"=>"Update User", "authenticity_token"=>"OM1lIzizuFCYlxC3XmtmG/btqAsyjekHtqsiwlUDn3M=", "utf8"=>"✓", "username"=>"1", "user"=>{"description"=>"Hello people! Give me your address. Get a postcard."}} 
     User Load (0.2ms) SELECT "users".* FROM "users" WHERE ("users"."username" = '1') LIMIT 1 
    Redirected to http://0.0.0.0:3000/ 
    ApplicationController::current_user 
    ApplicationController::current_user_session 
     User Load (0.3ms) SELECT "users".* FROM "users" WHERE ("users"."id" = 1) LIMIT 1 
     CACHE (0.0ms) SELECT "users".* FROM "users" WHERE ("users"."id" = 1) LIMIT 1 
    ApplicationController::current_user_session 
    Completed 302 Found in 102ms 

関連すくい路線:

users GET /users(.:format)        {:controller=>"users", :action=>"index"} 
           POST /users(.:format)        {:controller=>"users", :action=>"create"} 
         new_user GET /users/new(.:format)       {:controller=>"users", :action=>"new"} 
         edit_user GET /users/:id/edit(.:format)     {:controller=>"users", :action=>"edit"} 
          user GET /users/:id(.:format)       {:controller=>"users", :action=>"show"} 
           PUT /users/:id(.:format)       {:controller=>"users", :action=>"update"} 
           DELETE /users/:id(.:format)       {:controller=>"users", :action=>"destroy"} 
+0

あなたのアプリディレクトリに "rake routes"を実行し、あなたの質問に出力を追加してください。 – ddayan

+0

コントローラのto_paramメソッドがなぜですか? –

+0

にレーキルートが追加されました。 to_paramメソッドはidをusernameに置き換えるようにします。 http://api.rubyonrails.org/classes/ActiveRecord/Base.html#method-i-to_param – owilde1900

答えて

0

あなたのコードは私にはうまく見えますが、ログにはフォームが「put」を含む隠し番号_methodフィールドを表示していないことが表示されています。これは、form_forヘルパーが@userを既存のレコードとして認識しないために発生する可能性があります。私はこれが起こっかもしれない理由はわかりませんが、一時的な修正は、あなたのform_forヘルパーに以下を追加することです:

:html => { :method => :put} 
+1

これは終わりであり、私を定義の修正に導いた:url => {:action => "update"}これは動作してしまった。 – owilde1900

2

@Beerlington。あなたの答えは非常に近く、私に修正案を見つけることができました。メソッドを定義してもそれはできませんでしたが、アクションを定義していたのは何ですか。

<%= form_for @user, :url => { :action => "update" } do |form| %> 

これは何らかの理由でトリックでした...なぜアクションがアップデートとして定義されなかったのかわかりません。

1

フォーム用に生成されたHTMLを見てください。私はアクションがそうフォームが送信されたときに、あなたのルートファイルが

match '/:username' => 'users#show', :as => "user" 

を言うと、あなたが

Started POST "/1" for 127.0.0.1 at Wed Jan 05 19:08:06 -0500 2011 
    Processing by UsersController#show as HTML 

を送っているところがあると思う

action="/1" 

ようになります賭けていますform_forは、フォームのアクションを生成するためにto_paramに依存します。あなたがそれを書いたので、あなたは意図しない振る舞いをしています。

+0

@monocole - あなたは正しいです。フォームアクションは "/ 1"であり、実際にはshowメソッドを実行しようとしています。しかし、私はユーザーコントローラーとactiverecordのto_paramを削除しました。フォームはまだこのように動作しています。それはこれを引き起こしている何か他のものです.. – owilde1900

関連する問題