#ruby-on-rails-3 #forms #devise
#ruby-on-rails-3 #формы #разработать
Вопрос:
Я использую devise для регистрации пользователей, и я хотел бы иметь отдельный путь редактирования для пользователей, чтобы изменять / обновлять свои пароли. Я извлек представления регистрации devise и создал отдельный контроллер регистрации, как описано в Railscast 236
Я попытался создать новое действие с именем change_password в контроллере регистраций, но когда я пытаюсь задать маршрут с помощью match ‘/ change_password’, to => ‘registrations#change_password’, я получаю AbstractController :: Действия не найдены
контроллер регистрации
class RegistrationsController < Devise::RegistrationsController
def create
super
session[:omniauth] = nil unless @user.new_record?
end
def destroy
resource.destroy
set_flash_message :notice, :destroyed
sign_out_and_redirect(self.resource)
end
def change_password
render_with_scope :edit
end
private
def build_resource(*args)
super
if session[:omniauth]
@user.apply_omniauth(session[:omniauth])
@user.valid?
end
end
routes.rb
match 'auth/:provider/callback' => 'authentications#create'
resources :authentications
devise_for :users, :controllers => {:registrations => 'registrations'}
resources :posts do
member do
get :likers
end
collection do
get :search
end
end
resources :relationships, :only => [:create, :destroy]
resources :appreciations, :only => [:create, :destroy]
root :to => "pages#home"
match '/contact', :to => 'pages#contact'
match '/about', :to => 'pages#about'
match '/help', :to => 'pages#help'
match '/blog', :to => 'pages#blog'
resources :users do
member do
get :following, :followers, :likes
end
resources :collections
end
end
views/registrations/change_password.html.erb
<h2>Edit <%= resource_name.to_s.humanize %></h2>
<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name), :validate => true,
:html => { :method => :put }, :html => {:multipart => true}) do |f| %>
<%= devise_error_messages! %>
<p><strong>To change password, otherwise leave blank.</strong></p>
<p><%= f.label :current_password %> <i>(leave blank if you don't want to change it)</i><br />
<%= f.password_field :current_password %></p>
<p><%= f.label :password, "New password" %> <br />
<%= f.password_field :password %></p>
<p><%= f.label :password_confirmation %><br />
<%= f.password_field :password_confirmation %></p>
</div><br />
<p><%= f.submit "Update" %></p>
<% end %>
Ответ №1:
Попробуйте передать match ..
в блоке devise_for helper:
devise_for :users, :controllers => {:registrations => 'registrations'} do
match '/change_password', to => 'registrations#change_password'
end
Ответ №2:
Я обнаружил, что это самый простой способ разделить форму редактирования пользователя на edit amp; account
Первоначально у меня было
:name,
:email,
:avatar,
:location,
:website,
:bio,
:password (all in one form)
МАРШРУТЫ (это обеспечивает маршрут:
account_user ПОЛУЧИТЬ / users /:id / account (.:format) users#учетная запись)
resources :users do
member do
get :following, :followers, :account
end
end
USERS_CONTROLLER.RB
before_filter :signed_in_user, only: [:index, :edit, :update, :destroy, :following, :followers, :account]
before_filter :correct_user, only: [:edit, :update, :account]
def edit
@user = User.find(params[:id])
end
def account
@title = "Account"
@user = User.find(params[:id])
end
def update
if @user.update_attributes(params[:user])
flash[:success] = "Profile updated"
sign_in @user
redirect_to @user
elsif @title = "Account"
render 'account'
else
render 'edit'
end
end
(разделенные представления формы)
РЕДАКТИРОВАТЬ.HTML.ERB
<%= form_for @user, :html => { :multipart => true } do |f| %>
<%= render 'shared/error_messages', object: f.object %>
<%= f.label :name %>
<%= f.text_field :name %>
<%= f.label :avatar %><br />
<%= f.file_field :avatar %>
<%= f.label :location %>
<%= f.text_field :location %>
<%= f.label :website %>
<%= f.text_field :website %>
<%= f.label :bio %>
<%= f.text_area :bio, placeholder: "About yourself in 160 characters or less..." %>
<%= f.submit "Update Profile", class: "btn btn-medium btn-primary" %>
<% end %>
ACCOUNT.HTML.ERB
<%= form_for @user, :html => { :multipart => true } do |f| %>
<%= render 'shared/error_messages', object: f.object %>
<%= f.label :email %>
<%= f.text_field :email %>
<%= f.label :password %>
<%= f.password_field :password %>
<%= f.label :password_confirmation, "Confirm Password" %>
<%= f.password_field :password_confirmation %>
<%= f.submit "Update Account", class: "btn btn-medium btn-primary" %>
<% end %>
БОКОВАЯ ПАНЕЛЬ навигации ВНУТРИ ПРЕДСТАВЛЕНИЙ РЕДАКТИРОВАНИЯ И УЧЕТНОЙ ЗАПИСИ, ПОЭТОМУ пользователь ИМЕЕТ ДОСТУП К ФОРМЕ РЕДАКТИРОВАНИЯ И УЧЕТНОЙ ЗАПИСИ
<ol class="nav nav-tabs nav-stacked">
<% @user ||= current_user %>
<li>
<a href="<%= edit_user_path(@user) %>">
Profile
<i class="icon-chevron-right"></i>
</a>
</li>
<li>
<a href="<%= account_user_path(@user) %>">
Account
<i class="icon-chevron-right"></i>
</a>
</li>
</ol>