0

У меня есть настройка проверки подлинности и работа с ней, и я перенаправил пользователя на собственную страницу показа непосредственно после регистрации или входа в систему. Пользователь показать страницу и пользователь редактировать страницы может быть успешно обращались в браузере по адресу:Rails 4 Разработка ошибки маршрутизации при действии пользователя

myapp.com/users/1 и myapp.com/users/1/edit

, поскольку я установки пользователей контроллер - Теперь мне нужно просто принять меры в завещанию, которое обычно происходит при myapp.com/users/edit

edit_user_registration GET /users/edit(.:format) devise/registrations#edit 

..., который, по существу, функциональность учетной записи редактирования пользователя, и мне нужно, чтобы сделать это происходит вместо у пользователей /: id/edit. Когда я обращаюсь к пользователю/1/странице редактирования для своего пользователя и обновляю адрес электронной почты или пароль и нажимаю «Обновить» ... url изменяется на myapp.com/users/update_account, и я получаю следующую ошибку:

Unknown action 
The action 'update' could not be found for UsersController 

конфигурации/routes.rb

devise_for :users 

    resources :users 

    resources :users, only: [:edit] do 
    collection do 
     patch 'update' 
    end 
    end 

    root    'static_pages#home' 

    get '/users/:id', :to => 'users#show' 
    get '/users/:id/edit', :to => 'users#edit' 

    get '/help', to: 'static_pages#help' 
    get '/about', to: 'static_pages#about' 

рейк маршруты обеспечивает:

Prefix Verb URI Pattern     Controller#Action 
     new_user_session GET /users/sign_in(.:format)  devise/sessions#new 
      user_session POST /users/sign_in(.:format)  devise/sessions#create 
    destroy_user_session DELETE /users/sign_out(.:format)  devise/sessions#destroy 
      user_password POST /users/password(.:format)  devise/passwords#create 
     new_user_password GET /users/password/new(.:format) devise/passwords#new 
     edit_user_password GET /users/password/edit(.:format) devise/passwords#edit 
         PATCH /users/password(.:format)  devise/passwords#update 
         PUT /users/password(.:format)  devise/passwords#update 
cancel_user_registration GET /users/cancel(.:format)  devise/registrations#cancel 
     user_registration POST /users(.:format)    devise/registrations#create 
    new_user_registration GET /users/sign_up(.:format)  devise/registrations#new 
    edit_user_registration GET /users/edit(.:format)   devise/registrations#edit 
         PATCH /users(.:format)    devise/registrations#update 
         PUT /users(.:format)    devise/registrations#update 
         DELETE /users(.:format)    devise/registrations#destroy 
        users PATCH /users/update(.:format)  users#update 
         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 
        root GET /       static_pages#home 
        help GET /help(.:format)    static_pages#help 

My Header Ссылки на профиль пользователя и настройки учетной записи страницы:

просмотров/макеты/_navigation_links.html.erb

<% if user_signed_in? %> 
<div class="dropdown""> 
    <li class="dropdown-toggle" id="dropdownMenu1" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true"> 
    <%= current_user.email %> 
    <span class="caret"></span> 
    </li> 
    <ul class="dropdown-menu" aria-labelledby="dropdownMenu1"> 
     <li><%= link_to 'My Profile', user_path %></li> 
    <li><%= link_to 'Account Settings', edit_user_path %></li> 
    <li><a href="#">Edit Profile</a></li> 
    <li role="separator" class="divider"></li> 
     <li><%= link_to 'Log out', destroy_user_session_path, method: :delete %></li> 
    </ul> 
</div> 
<% elsif %> 
    <li><%= link_to "Sign Up", new_user_registration_path %></li> 
    <li><%= link_to "Sign In", new_user_session_path %></li> 
<% end %> 

Мой Пользователи Контроллер:

class UsersController < ApplicationController 
    before_filter :authenticate_user! 

    def edit 
    @user = current_user 
    end 

    def update 
    @user = User.find(current_user.id) 
    if @user.update_with_password(user_params) 
    # Sign in the user by passing validation in case their password changed 
     sign_in @user, :bypass => true 
     redirect_to @user 
    else 
     render "edit" 
    end 
    end 

    private 

    def user_params 
     params.require(:user).permit(:email, :password, :password_confirmation, :current_password) 
    end 

end 

Мои Просмотры/Пользователи/edit.html.erb

<% provide(:title, "Edit user") %> 

    <div class="container middle"> 

    <!-- SideBar NEED TO REFACTOR TO A USER LAYOUT FILE --> 
    <div class="sidebar col-md-3"> 
    </div> 

    <div class="main-content col-md-9"> 

     <div class="main-breadcrumb"> 
     Some Content 
     </div> 

     <div class="section_header"> 
      <h3>Edit Account</h3> 
     </div> 

     <div class="row-fluid"> 
     <div class="col-md-6"> 
     <%= form_for(@user, :url => { :action => "update" }) do |f| %> 

      <div class="field"> 
      <%= f.label :email %><br /> 
      <%= f.email_field :email, autofocus: true %> 
     </div> 

     <div class="field"> 
      <%= f.label :password %> <i>(leave blank if you don't want to change it)</i><br /> 
      <%= f.password_field :password, autocomplete: "off" %> 
     </div> 

     <div class="field"> 
      <%= f.label :password_confirmation %><br /> 
      <%= f.password_field :password_confirmation, autocomplete: "off" %> 
     </div> 

     <div class="field"> 
      <%= f.label :current_password %> <i>(we need your current password to confirm your changes)</i><br /> 
      <%= f.password_field :current_password, autocomplete: "off" %> 
      </div> 

      <div class="actions"> 
      <%= f.submit "Update" %> 
      </div> 
     <% end %> 

     <h3>Cancel my account</h3> 
     # I removed the devise 'cancel account' functionality for now 

     <%= link_to "Back", :back %> 
     </div> 
     </div> 

    </div><!-- end main content section --> 

    </div><!-- end Container --> 

Любая помощь о том, как исправить эту ошибку, будет оценено.

+0

Почему вы хотите использовать 'update_account' вместо более стандартного' update'? Насколько я могу судить, они сделают то же самое ... – PJSCopeland

ответ

1

Браузер посылает PATCH /users/update_account, что похоже на то, что вы хотите. Тем не менее, первая строка в rake routes совпавший:

PATCH /users/:id(.:format) users#update 

... который не то, что вы хотите.

У вас есть resources :users дважды в config/routes.rb; вы должны иметь его только один раз. Попробуйте это:

resources :users do 
    collection do 
    patch 'update_account' 
    end 
end 

Это создаст все стандартные маршруты для users, в качестве верхней строки в настоящее время делает, но и /users/update_account - Я думаю, что прежде, чем всех стандартных.

+0

спасибо Copeland ... вы порекомендовали мне сначала изменить все update_account, чтобы просто «обновить»? – BB500

+0

Ну, теперь, когда я снова смотрю на это, есть еще одна разница, потому что 'update_account' не принимает параметр': id' и просто загружает текущего пользователя - что имеет смысл, поэтому я думаю, что все в порядке. – PJSCopeland

+1

Если вы хотите, чтобы некоторые пользователи могли редактировать учетные записи других пользователей, я бы выполнил большую часть работы в '# update'; то '# update_account' просто установит' @user = current_user' и вызовет 'update' как метод, а не действие (в то время как' # update' как * действие * будет иметь 'before_filter', который нашел пользователя по ID) , – PJSCopeland