2016-10-18 80 views
2

我是新來的鐵軌,目前有問題,而我的方式通過鐵軌教程。我在示例應用程序的第10章。我檢查,以確保資源:用戶包含在routes.rb配置文件中,但我仍然想出這個錯誤 - 請幫助!沒有路線匹配[補丁]「/用戶/ 1 /編輯」

No route matches [PATCH] "https://stackoverflow.com/users/1/edit". 

運行軌道路線產生

Prefix Verb URI Pattern    Controller#Action 
    root GET /      static_pages#home 
    help GET /help(.:format)   static_pages#help 
    about GET /about(.:format)   static_pages#about 
    contact GET /contact(.:format)  static_pages#contact 
    signup GET /signup(.:format)   users#new 
     POST /signup(.:format)   users#create 
    login GET /login(.:format)   sessions#new 
     POST /login(.:format)   sessions#create 
logout DELETE /logout(.:format)   sessions#destroy 
    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 
     PATCH /users/:id(.:format)  users#update 
      PUT /users/:id(.:format)  users#update 
     DELETE /users/:id(.:format)  users#destroy 

我已經配置像這樣我的文件:

的config/routes.rb中

Rails.application.routes.draw do 
    root     'static_pages#home' 
    get '/help', to: 'static_pages#help' 
    get '/about', to: 'static_pages#about' 
    get '/contact', to: 'static_pages#contact' 
    get '/signup', to: 'users#new' 
    post '/signup', to: 'users#create' 
    get '/login', to: 'sessions#new' 
    post '/login', to: 'sessions#create' 
    delete '/logout', to: 'sessions#destroy' 
    resources :users 
end 

型號/ user.rb

validates :password, presence: true, length: { minimum: 6 }, allow_nil: true 

/users/_form.html.erb

<%= form_for(@user, url: yield(:url)) do |f| %> 
    <%= render 'shared/error_messages', object: @user %> 

    <%= f.label :name %> 
    <%= f.text_field :name, class: 'form-control' %> 

    <%= f.label :email %> 
    <%= f.email_field :email, class: 'form-control' %> 

    <%= f.label :password %> 
    <%= f.password_field :password, class: 'form-control' %> 

    <%= f.label :password_confirmation %> 
    <%= f.password_field :password_confirmation, class: 'form-control' %> 

    <%= f.submit yield(:button_text), class: "btn btn-primary" %> 
<% end %> 

用戶/ new.html.erb

<% provide(:title, 'Sign up') %> 
<% provide(:button_text, 'Create my account') %> 
<% provide(:url, signup_path) %> 

<h1>Sign up</h1> 
<div class="row"> 
    <div class="col-md-6 col-md-offset-3"> 
    <%= render 'form' %> 
    </div> 
</div> 

用戶/編輯。 html.erb

<% provide(:title, 'Edit user') %> 
<% provide(:button_text, 'Save changes') %> 
<% provide(:url, edit_user_path(@user)) %> 

<h1>Update your profile</h1> 
<div class="row"> 
    <div class="col-md-6 col-md-offset-3"> 
    <%= render 'form' %> 
    <div class="gravatar_edit"> 
     <%= gravatar_for @user %> 
     <a href="http://gravatar.com/emails" target="_blank" rel="noopener">Change</a> 
    </div> 
    </div> 
</div> 

回答

3

你不應該做一個補丁來編輯。你應該做一個補丁來更新。

<% provide(:url, user_path(@user)) %> 

按照慣例,你通常會調用編輯控制器上(GET方法edit_user_path(@user),你在做什麼。這將導致你的edit.html.erb渲染而這又是呈現形式。然後,表單本身應該在users_path(@user)上通過PATCH方法調用控制器上的更新操作(而不是編輯操作)。該URL與POST相同(創建新用戶時),因此您可以刪除線

<% provide(:url, user_path(@user)) %> 

,改變的form_for只使用users_path

<%= form_for(@user, url: user_path) do |f| %> 

注意,不要使用'users_path'作爲鏈接到用戶的索引索引,因爲沒有PATCH方法可用於該路由,您將收到錯誤。

+0

我愛你。在流下幾滴眼淚之後,我終於想到了這部分。 –

+0

大聲笑...在那裏...做到了......得到了T恤XD – David

+0

哈哈,我相信在本教程結束時,我會有一個全新的衣櫥+捐款。謝謝一堆。 –

0

您試圖訪問你的編輯控制器的動作是不是與你已經在路由模式洽的方式。試試這個:

Rails.application.routes.draw do 
    root     'static_pages#home' 
    get '/help', to: 'static_pages#help' 
    get '/about', to: 'static_pages#about' 
    get '/contact', to: 'static_pages#contact' 
    get '/signup', to: 'users#new' 
    post '/signup', to: 'users#create' 
    get '/login', to: 'sessions#new' 
    post '/login', to: 'sessions#create' 
    delete '/logout', to: 'sessions#destroy' 
    patch '/users/:id/edit', to: 'users#edit' 
    resources :users 
end 
+0

這就是你真棒,它的作品!我沒有再收到路由錯誤,但該頁面在更新後不會執行redirect_to @user?我將不得不做另一次搜索!真棒! –

+0

沒有問題我很高興我可以幫助隨時接受答案:) –