Как убрать разработать маршрут, чтобы зарегистрироваться?



Я использую Devise в приложении Rails 3, но в этом случае пользователь должен быть создан существующим пользователем, который определяет, какие разрешения он/она будет иметь.



из-за этого, я хочу:




  • до удалить маршрут для пользователей, чтобы зарегистрироваться.

  • до по-прежнему позволяют пользователям редактировать свои профили (изменить адрес электронной почты и пароль) после они подписали


как я могу это сделать это?



в настоящее время я эффективно удаляю этот маршрут, помещая следующее Перед devise_for :users:



match 'users/sign_up' => redirect('/404.html')


это работает, но я думаю, есть лучший способ?



обновление



как сказал Бенуа Гаррет, лучшим решением в моем случае является пропустить создание маршрутов регистрации в массовом порядке и просто создать те, которые я действительно хочу.



чтобы сделать это, я сначала побежал rake routes, затем использовал выход для повторного создания тех, которые я хотел. Конец результат был такой:



devise_for :users, :skip => [:registrations] 
as :user do
get 'users/edit' => 'devise/registrations#edit', :as => 'edit_user_registration'
put 'users' => 'devise/registrations#update', :as => 'user_registration'
end


внимание:




  • у меня еще есть :registerable в своем User модель


  • devise/registrations обрабатывает обновление электронной почты и пароль

  • обновление других атрибутов пользователя-разрешений и т. д.-обрабатывается другим контроллером


правильный ответ:



удалите маршрут для путей Devise по умолчанию; т. е.:



devise_for :users, path_names: {
sign_up: ''
}
724   14  

14 ответов:

Я тоже пытался это сделать, но нить в группе devise google отговорил меня от поиска действительно чистое решение.

Я процитирую Жозе Валима (Хранителя изобретения):

нет прямого варианта. Вы можете либо предоставить патч или использовать :пропустить => :регистрируемые и добавлять только те маршруты, которые вы хотите.

исходный вопрос был :

есть ли хороший способ, чтобы удалить конкретный маршрут (удалить маршрут) с рельсов?

вы можете сделать это в вашей модели

# typical devise setup in User.rb
devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable

меняем его на:

devise :database_authenticatable, :recoverable, :rememberable, :trackable, :validatable

обратите внимание, что символ :registerable была изъята

вот и все, больше ничего не требуется. Все маршруты и ссылки на страницу регистрации также волшебным образом удаляются.

у меня была аналогичная проблема, пытался удалить devise_invitable пути создать и новая:

перед:

 devise_for :users

маршруты грабли

accept_user_invitation GET    /users/invitation/accept(.:format)           devise/invitations#edit
       user_invitation POST   /users/invitation(.:format)                  devise/invitations#create
   new_user_invitation GET    /users/invitation/new(.:format)              devise/invitations#new
                       PUT    /users/invitation(.:format)                  devise/invitations#update

после

devise_for :users , :skip => 'invitation'
devise_scope :user do
  get "/users/invitation/accept", :to => "devise/invitations#edit",   :as => 'accept_user_invitation'
  put "/users/invitation",        :to => "devise/invitations#update", :as => nil
end

маршруты грабли

accept_user_invitation GET    /users/invitation/accept(.:format)                 devise/invitations#edit
                       PUT    /users/invitation(.:format)                        devise/invitations#update

Примечание 1 разработать область https://github.com/plataformatec/devise#configuring-routes

примечание 2. Я применяю его на devise_invitable, но он будет работать с любым devise * able feature

важное замечание: смотрите, что devise_scope включен пользователей не пользователи ? это верно, следите за этим ! Это может вызвать много боли, давая вам эту проблему:

Started GET "/users/invitation/accept?invitation_token=xxxxxxx" for 127.0.0.1 
Processing by Devise::InvitationsController#edit as HTML
  Parameters: {"invitation_token"=>"6Fy5CgFHtjWfjsCyr3hG"}
 [Devise] Could not find devise mapping for path "/users/invitation/accept?  invitation_token=6Fy5CgFHtjWfjsCyr3hG".
This may happen for two reasons:

1) You forgot to wrap your route inside the scope block. For example:

  devise_scope :user do
     match "/some/route" => "some_devise_controller"
  end

 2) You are testing a Devise controller bypassing the router.
   If so, you can explicitly tell Devise which mapping to use:

    @request.env["devise.mapping"] = Devise.mappings[:user]

нашел следующий пост похож на этот и хотел поделиться ответом @chrisnicola дал. В сообщении они пытались блокировать только регистрацию пользователей во время производства.

вы также можете изменить контроллер регистраций. Вы можете использовать что-то вроде этого:

на "приложение/контроллеры/registrations_controller.РБ"

class RegistrationsController < Devise::RegistrationsController
  def new
    flash[:info] = 'Registrations are not open.'
    redirect_to root_path
  end

  def create
    flash[:info] = 'Registrations are not open.'
    redirect_to root_path
  end
end

Это будет переопределить контроллер разработать и использовать вместо указанных выше способов. Они добавили флэш-сообщения упаковывают, что кто-то каким-то образом добрался до страницы sign_up. Вы также должны иметь возможность изменить перенаправление на любой путь, который вам нравится.

и в " config / routes.РБ" вы можете добавить это:

devise_for :users, :controllers => { :registrations => "registrations" }

оставив его, как это позволит вам использовать стандартный devise редактировать свой профиль. Если вы хотите, вы все еще можете переопределить опцию Редактировать профиль, включив

  def update
  end

в "приложение/контроллеры/registrations_controller.РБ"

вы можете переопределить "devise_scope", поместив его перед"devise_for".

devise_scope :user do
  get "/users/sign_up",  :to => "sites#index"
end

devise_for :users

Не уверен, что это лучший способ но мое решение на данный момент, так как он просто перенаправляет обратно на страницу входа.

Это старый вопрос - но я недавно решил ту же проблему и придумал решение, которое гораздо более элегантно, чем:

devise_for :users, :skip => [:registrations] 
as :user do
  get 'users/edit' => 'devise/registrations#edit', :as => 'edit_user_registration'
  put 'users' => 'devise/registrations#update', :as => 'user_registration'
end

и он дает имена по умолчанию для именованных маршрутов (например,cancel_user_registration) без излишней многословности.

devise_for :users, skip: [:registrations]

# Recreates the Devise registrations routes
# They act on a singular user (the signed in user)
# Add the actions you want in 'only:'
resource :users,
    only: [:edit, :update, :destroy],
    controller: 'devise/registrations',
    as: :user_registration do
  get 'cancel'
end

rake routes выход с модулями devise по умолчанию:

                  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
  edit_user_registration GET    /users/edit(.:format)          devise/registrations#edit
       user_registration PATCH  /users(.:format)               devise/registrations#update
                         PUT    /users(.:format)               devise/registrations#update
                         DELETE /users(.:format)               devise/registrations#destroy

сделайте это в маршрутах.РБ

devise_for :users, :controllers => {:registrations => "registrations"}, :skip => [:registrations]
  as :user do
    get 'users/edit' => 'devise/registrations#edit', :as => 'edit_user_registration'
    put 'users' => 'devise/registrations#update', :as => 'user_registration'
end

  devise_scope :user do
    get "/sign_in",  :to => "devise/sessions#new"
    get "/sign_up",  :to => "devise/registrations#new"
  end

вы получите сообщение об ошибке теперь, когда вы пришли, чтобы войти в страницу, чтобы исправить это. Сделать такое изменение: приложение/просмотров/разработать/общая/_links.Эрб

<% if  request.path != "/sign_in" %>
    <%- if devise_mapping.registerable? && controller_name != 'registrations' %>
        <%= link_to "Sign up", new_registration_path(resource_name) %><br />
    <% end -%>
<% end %>

мне понравилось @Макс ответ, но когда пытаюсь использовать его, я столкнулся с ошибкой из-за devise_mapping будучи Нил.

Я немного изменил его решение, чтобы решить эту проблему. Это потребовало обертывания вызова на resource внутри devise_scope.

devise_for :users, skip: [:registrations]

devise_scope :user do
  resource :users,
           only: [:edit, :update, :destroy],
           controller: 'devise/registrations',
           as: :user_registration do
    get 'cancel'
  end
end

отметим, что devise_scope ожидает особой :user, тогда как resource ожидает множественное число :users.

для других в моем случае.
С devise (3.5.2).
Я успешно удалил маршруты для регистрации, но сохранил те, чтобы редактировать профиль, со следующим кодом.

#routes.rb
devise_for :users, skip: [:registrations]
as :user do
  get 'users/edit' => 'devise/registrations#edit', :as => 'edit_user_registration'
  put '/users(.:format)' => 'devise/registrations#update', as: 'user_registration'
  patch '/users(.:format)' => 'devise/registrations#update'
end

я обнаружил, что это хорошо работает, не возясь с маршрутами или добавляя методы контроллера приложений. Мой подход заключается в том, чтобы переопределить разработать метод. Добавьте это в app/controllers/devise/registrations_controller.rb Я опустил другие методы для краткости.

class Devise::RegistrationsController < DeviseController
  ...
  # GET /resource/sign_up
  def new
    redirect_to root_path
  end
  ....
end

кроме того, чтобы удалить иллюзию, что этот путь все еще доступен из других представлений, вы также можете удалить этот код из app/views/devise/shared/_links.erb

<%- if devise_mapping.registerable? && controller_name != 'registrations' %>
  <%= link_to "Sign up", new_registration_path(resource_name) %><br />
<% end -%>

вот немного другой маршрут я пошел. Это делает его так, что вам не придется переопределять devise/shared/_links.html.erb вид.

на app/models/user.rb:

devise :database_authenticatable, :recoverable, :rememberable, :trackable, :validatable

на config/routes.rb:

devise_for :users
devise_scope :user do
  put 'users' => 'devise/registrations#update', as: 'user_registration'
  get 'users/edit' => 'devise/registrations#edit', as: 'edit_user_registration'
  delete 'users' => 'devise/registrations#destroy', as: 'registration'
end

перед:

$ rake routes | grep devise
           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

после:

$ rake routes | grep devise
           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
          user_registration PUT    /users(.:format)                            devise/registrations#update
     edit_user_registration GET    /users/edit(.:format)                       devise/registrations#edit
               registration DELETE /users(.:format)                            devise/registrations#destroy

у меня была та же проблема, и я обнаружил, что это немного плохая практика для перенаправления пользователей со страницы регистрации. Так что мое решение в основном не использует :registrable на всех.

то, что я сделал, это создать подобную страницу, Как редактировать данные пользователя, которые выглядели так:

<%= form_tag(update_user_update_path, method: :post) do %>  
    <br>
    <%= label_tag(:currPassword, 'Current password:') %> <%= password_field_tag(:currPassword) %> <br>
    <%= label_tag(:newPassword, 'New password:') %> <%= password_field_tag(:newPassword) %> <br>
    <%= label_tag(:newPasswordConfirm, 'Confirm new password:') %> <%= password_field_tag(:newPasswordConfirm) %> <br>
    <%= submit_tag('Update') %>
<% end %>

таким образом, эта форма отправляет в новую конечную точку post, которая обновляет пароль, который выглядит следующим образом:

  def update
    currPass = params['currPassword']
    newPass1 = params['newPassword']
    newPass2 = params['newPasswordConfirm']
    currentUserParams = Hash.new()
    currentUserParams[:current_password] = currPass
    currentUserParams[:password] = newPass1
    currentUserParams[:password_confirmation] = newPass2
    @result = current_user.update_with_password(currentUserParams)
  end

позже вы можете использовать @result на ваш взгляд, чтобы определить пользователя пароль обновляется или нет.

изменение маршрутов есть целая куча других проблем, которые приходят с этим. Самый простой способ, который я нашел, это сделать следующее.

ApplicationController < ActionController::Base
  before_action :dont_allow_user_self_registration

  private

  def dont_allow_user_self_registration
    if ['devise/registrations','devise_invitable/registrations'].include?(params[:controller]) && ['new','create'].include?(params[:action])
      redirect_to root_path
    end
  end
end

вы можете изменить devise сам камень. Во-первых, выполните эту команду, чтобы найти установленное место использования:

gem which devise

предположим, что путь: /usr/local/lib/ruby/gems/1.9.1/gems/devise-1.4.2/lib/devise

затем перейдите к

/usr/local/lib/ruby/gems/1.9.1/gems/devise-1.4.2/lib/devise/lib/devise/rails редактировать routes.rb в этом каталоге. Существует метод под названием def devise_registration(mapping, controllers) что вы можете изменить, чтобы избавиться от новых действий. Вы также можете полностью удалить сопоставления для devise_registration

Comments

    Ничего не найдено.