1
나는이 문제를 인정하기보다는 오랫동안이 문제로 어려움을 겪고있다. 이전에 STI 모델에서 라우팅 문제가 있었지만 지금은 해결 된 것 같습니다 (SO 덕분에).레일즈가 명시 적 동작을 사용하지 않음
내 문제는 일단 내가/kids/1/edit에서 양식을 업데이트하면 기록을 저장하는 대신 기록을 다시 얻는 것입니다. 나는 기본적인 것을 놓치고 있다는 것을 안다. 그러나 오랜 시간이 문제를 해결 한 후에 대답은 나를 벗어난다. 양식 제출과 함께 kidupdate 액션을 명시 적으로 호출하고 있음을 알 수 있습니다.
미리 감사드립니다.
kidedit.html.erb
<% provide(:title, "Edit user") %>
<h1>Update your profile</h1>
<div class="row">
<div class="span5 offset3">
<%= form_for(@kid, url: kidedit_path) do |f| %>
<#%= render 'shared/error_messages', object: f.object %>
<%= f.label :fname, "First Name" %>
<%= f.text_field :fname %>
<%= f.label :lname, "Last Name" %>
<%= f.text_field :lname %>
<%= f.label :email %>
<%= f.text_field :email %>
<%= f.label :type, "Are you a Kid or Parent" %>
<%= f.select :type, [['Kid','Kid'],['Parent','Parent']] %>
<%= f.label :password %>
<%= f.password_field :password %>
<%= f.label :password_confirmation, "Confirmation" %>
<%= f.password_field :password_confirmation %>
<%= f.submit "Save changes", class: "btn btn-large btn-primary", :controller => 'users', :action => 'kidupdate' %>
<% end %>
</div>
</div>
users_controller.rb
def kidupdate
@kid = Kid.find(params[:id])
if @kid.update_attributes(params[:kid])
flash[:success] = "Profile updated"
sign_in @kid
redirect_to kidshow_path
else
render kidedit_path(@kid)
end
end
routes.rb
Kidtunes::Application.routes.draw do
root to: 'static_pages#home'
match '/help', to: 'static_pages#help'
match '/contact', to: 'static_pages#contact'
match '/signup', to: 'users#new'
match '/signin', to: 'sessions#new'
match '/signout', to: 'sessions#destroy', via: :delete
match 'kids/:id' => 'users#kidupdate', via: :put, :as => :kidupdate
match 'kids/:id' => 'users#kidshow', via: :get, :as => :kidshow
match 'kids/:id/edit' => 'users#kidedit', :as => :kidedit
resources :users
resources :sessions, only: [:new, :create, :destroy]
다음
서버 로그의 내용은 다음과 같습니다
Started PUT "/kids/1/edit" for 127.0.0.1 at 2012-11-05 07:52:28 -0500
Processing by UsersController#kidedit as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"T8RqFt9lxdbZU+1cOh2E5yu2CFbVRDGmRcj2XdDN1ZU=", "user"=>{"fname"=>"Dante", "lname"=>"Refford", "email"=>"[email protected]", "type"=>"Kid", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}, "commit"=>"Save changes", "id"=>"1"}
Kid Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."type" IN ('Kid') AND "users"."id" = ? LIMIT 1 [["id", "1"]]
Rendered users/kidedit.html.erb within layouts/application (4.1ms)
Rendered layouts/_shim.html.erb (0.0ms)
User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."remember_token" = '1RZr3qfB6QSh42_jQ9qNWQ' LIMIT 1
Rendered layouts/_header.html.erb (2.5ms)
Rendered layouts/_footer.html.erb (0.3ms)
Completed 200 OK in 67ms (Views: 46.3ms | ActiveRecord: 1.0ms)
경로
$rake routes
root / static_pages#home
help /help(.:format) static_pages#help
contact /contact(.:format) static_pages#contact
signup /signup(.:format) users#new
signin /signin(.:format) sessions#new
signout DELETE /signout(.:format) sessions#destroy
kidupdate PUT /kids/:id(.:format) users#kidupdate
kidshow GET /kids/:id(.:format) users#kidshow
kidedit /kids/:id/edit(.:format) users#kidedit
users GET /users(.:format) users#index
POST /users(.:format) users#create
new_user GET /users/new(.:format) users#new
edit_user GET /users/:id/edit(.:format) users#edit
user GET /users/:id(.:format) users#show
PUT /users/:id(.:format) users#update
DELETE /users/:id(.:format) users#destroy
sessions POST /sessions(.:format) sessions#create
new_session GET /sessions/new(.:format) sessions#new
session DELETE /sessions/:id(.:format) sessions#destroy
당신이 어디에 양식 포인트의 URL 경로는 것을 확인할 수있다'kidupdate_path'하지 'kidedit_path'? 내가 말할 수있는 것부터, 폼은 폼을 다시 렌더링하는 후자를 가리키고 있습니다. 또한 제출 단추에서 양식 작업을 재정의하는 것을 보았습니다. – josemota
josemota가 맞다. 폼에서 잘못된 액션을 지적하고 제출 버튼의 액션 설정은 쓸모가 없다. 또한 업데이트를위한 다른 경로를 사용하고 여러 가지를 혼합하여 사용할 것을 권장합니다. – Matzi
제출 후 페이지를 표시하거나 편집하려면 리디렉션 하시겠습니까? –