私はバニティ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"}
あなたのアプリディレクトリに "rake routes"を実行し、あなたの質問に出力を追加してください。 – ddayan
コントローラのto_paramメソッドがなぜですか? –
にレーキルートが追加されました。 to_paramメソッドはidをusernameに置き換えるようにします。 http://api.rubyonrails.org/classes/ActiveRecord/Base.html#method-i-to_param – owilde1900