2012-11-05 4 views
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 
+1

당신이 어디에 양식 포인트의 URL 경로는 것을 확인할 수있다'kidupdate_path'하지 'kidedit_path'? 내가 말할 수있는 것부터, 폼은 폼을 다시 렌더링하는 후자를 가리키고 있습니다. 또한 제출 단추에서 양식 작업을 재정의하는 것을 보았습니다. – josemota

+0

josemota가 맞다. 폼에서 잘못된 액션을 지적하고 제출 버튼의 액션 설정은 쓸모가 없다. 또한 업데이트를위한 다른 경로를 사용하고 여러 가지를 혼합하여 사용할 것을 권장합니다. – Matzi

+0

제출 후 페이지를 표시하거나 편집하려면 리디렉션 하시겠습니까? –

답변

1

첫 댓글이 양식이 update_path 방법을 사용한다, 말처럼

<%= form_for(@kid, url: kidupdate_path) do |f| %>