2016-11-21 2 views
0

В моем приложении rails у меня есть два метода обновления для обновления профиля пользователей.Ruby on Rails: Добавление дополнительных RESTFUL-действий

Во-первых, у меня будет запрос GET 'account_settings', который будет использовать стандартное действие REST для обновления/обновления для обновления определенных параметров. Затем я хотел бы получить дополнительные действия «edit_profile» и «update_profile», чтобы получить страницу, которая позволит пользователю обновлять различные пользовательские атрибуты. Вот как это выглядит в моем users_controller.rb для лучшей идеи:

#For account settings page 

    #This is for the account settings page 
    #(only changing email and password) 
    def edit 
     @user = User.find(params[:id]) 
    end 

    def update 
     @user = User.find(params[:id]) 
     respond_to do |format| 
      if @user.update_attributes(account_settings_params) 
       flash.now[:success] = "Your settings have been successfully updated." 
       format.html {redirect_to @user} 
      else 
       format.html {redirect_to edit_user_path} 
       flash[:error] = "Please be sure to fill out your email, password, and password confirmation." 
      end 
     end 
    end 

    def edit_profile 
     @user = User.find(params[:id]) 
    end 

    #For update profile 
    def update_profile 
     @user = User.find(params[:id]) 
     respond_to do |format| 
      if @user.update_attributes(user_profile_params) 
       flash.now[:success] = "Your profile has been updated." 
       format.html {redirect_to @user} 
      else 
       format.html {redirect_to edit_profile_user_path} 
       flash[:error] = "Please be sure to fill out all the required profile form fields." 
      end 
     end 
    end 


    private 

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

    def user_profile_params 
     params.require(:user).permit(:name, :about_me, :location, :image_url) 
    end 

Выбора из моего текущего routes.rb:

#Account Settings Just for Email and Password 
get 'account_settings' => 'users#edit' 
patch 'settings' => 'users#update' 
resources :users do 
    member do 
     get :edit_profile 
     put :update_profile 
    end 
end 

Результатов рек маршрутов:

edit_profile_user GET /users/:id/edit_profile(.:format)  users#edit_profile 
update_profile_user PATCH /users/:id/update_profile(.:format)  users#update_profile 
       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 

Моего NavBar частичный:

  -if logged_in? 
       -# Logged in links 
       %li 
        =link_to 'Logout', logout_path, method: :delete 
       %li 
        =link_to 'Account Settings',edit_user_path(@current_user) 
       %li 
        =link_to 'Edit My Profile', edit_profile_user_path(@current_user) 
       %li 
        =link_to 'View My Profile', user_path(@current_user) 
       %li 
        =link_to 'Members', users_path 

На странице edit_profile, моя форма выглядит следующим образом:

=form_for @user, path: update_profile_user_path(@user) do |f| 

С моей текущей реализацией, посетив страницу edit_profile и размещение формы приведет обратно на обычную страницу редактирования с моими Рельсами сервер о том, что параметры были неразрешенными , Однако, как вы можете видеть в моем методе update_profile в моем контроллере, метод контроллера для update_profile принимает user_profile_params, а не account_settings_params. Любое понимание того, почему это может быть сделано?

+0

использовать 'member' или' collection' блок внутри маршрутов пользователей – uzaif

ответ

1

Несколько замечаний:

  • Вам не нужно render "edit_profile" потому, что это делается по умолчанию
  • Вам не нужно, чтобы перезаписать Изменить маршрут
  • я настоятельно рекомендую на самом деле имея отдельный контроллер профиля, вместо того, чтобы пытаться взломать его в качестве дополнительных действий для пользователя.

Это, как говорится, маршруты выглядят

resources :users do 
    member do 
    get :edit_profile 
    patch :update_profile 
    end 
end 

тогда ваша ссылка будет для пользователей/1/edit_profile (link_to "edit", edit_profile_path(@user)) и форма будет <%= form_for @user, path: update_user_path(@user) %>

+0

Эй, как именно он знает, что редактировать профиль будет принимать в идентификатор пользователя в качестве аргумента, чтобы привести меня к этому пути? –

+0

Уточнено мое исходное сообщение с текущими маршрутами и ошибкой со ссылками –

+0

'rake routes' даст вам список маршрутов ..!это, вероятно, edit_profile_user_path (@user) - и, как сказал другой член, идентификатор пользователя состоит в том, что он находится в блоке «member». – court3nay

1

Чтобы добавить RESTful маршруты к текущим ресурсам вы можете использовать коллекцию или членов на основе этого требования. collection используется как не членский ресурс, такой как действие индекса, которое дает коллекцию объектов, где для действия show action требуется объект для отображения. Следовательно, для получения действия одного объекта используется member. Здесь вы можете использовать

resources users do 
    resources member do 
    get :edit_profile 
    put :update_profile 
    end 
end 

Вы также можете использовать

resources :users do 
    get :edit_profile, on: :member 
    put :update_profile, on: :member 
end 
Смежные вопросы