2013-09-26 2 views
8

Я пытаюсь сделать так, чтобы только администраторы могли добавлять приложения с использованием. Я получил работу в основном, но теперь, когда я зарегистрировался как администратор и отправлю форму регистрации, она возвращает меня с ошибкой: You are already signed in.Позволяя администраторам добавлять пользователей с помощью Devise

Я попытался выполнить следующие инструкции здесь: http://wiki.summercode.com/rails_authentication_with_devise_and_cancan, но это похоже, не упоминает эту ситуацию.

Должен ли я сделать дальнейшее переопределение в editors_controller, чтобы это можно было сделать?

Вот мои маршруты ("редактора" это имя моей пользовательской модели):

devise_for :admins, :skip => [:registrations] 

as :admin do 
    get 'admin/editors'  => 'editors#index',     as: :admin_editors 
    get 'admin/editors/new' => 'editors#new',     as: :new_editor 
    delete 'admin/editors/:id' => 'editors#destroy',    as: :destroy_editor 
end 


devise_for :editors, :skip => [:registrations], :controllers => { :registrations => "editors" } 

и мой editors_controller в "приложении/контроллерах /"

class EditorsController < Devise::RegistrationsController 
    before_filter :check_permissions, :only => [:new, :create, :cancel] 
    skip_before_filter :require_no_authentication 

    def dashboard 
    render "editors/dashboard.html.haml" 
    end 

    def index 
    @editors = Editor.all 
    respond_to do |format| 
     format.html 
    end 
    end 

    private 
    def check_permissions 
     authorize! :create, resource 
    end 
end 

EDIT I заметил это Processing by Devise::RegistrationsController#create as HTML в журналах, когда я отправляю форму. Я подозревал, что, возможно, skip_before_filter :require_no_authentication не вызывался, но предположил, что, поскольку EditorsController наследовал от RegistrationController, до того, как фильтр будет работать должным образом. Разве это не так?

ответ

6

Вы должны реализовать свой собственный метод create на EditorsController вместо того, чтобы наследовать это действие от Devise::RegistrationsController. Как вы видите, метод в Devise::RegistrationsController сначала проверяет, не вошли ли вы в систему и оттолкнули вас назад, если хотите. Если вы не вошли в систему, вы создадите учетную запись User, а затем зарегистрируете ее в качестве этого пользователя.

Вы пытаетесь обойти эту проблему с skip_before_filter :require_no_authentication, но вполне вероятно, что ваша форма POST ИНГ /editors вместо /admin/editors. Итак, вам нужно добавить маршрут, который позволяет добраться до create на EditorsController:

as :admin do 
    post 'admin/editors' => 'editors#create' 
    # your other :admin routes here 
end 

Затем вы хотите осуществить уменьшенную версию create. Вы, вероятно, хотите что-то вроде как это:

class EditorsController < Devise::RegistrationsController 
    def create 
    build_resource(sign_up_params) 
    if resource.save 
     redirect_to admin_editors_path 
    else 
     clean_up_passwords resource 
     respond_with resource 
    end 
    end 

    # your other methods here 
end 

Вы также хотите, чтобы убедиться, что admin/editors/new шаблон указывает форму на правильный маршрут ('admin/editors').

+0

привет Джереми, я пробовал творить действие, но он все еще обходит форму и лижет меня сообщением «Ты уже подписан». есть идеи? – BKSpurgeon

1

Ни один из решений googleable не работал, когда я их пробовал. Это работает

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

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

Добавить этот маршрут

post 'savenew', to: 'users#savenew' 

Добавить это действие в контроллер пользователя:

def savenew 
    rawsql = "insert into users (email, created_at,updated_at) values ('#{user_params[:email]}',now(), now())" 
    sql = rawsql 
    ActiveRecord::Base.connection.execute(sql) 
    redirect_to action: 'index'' 
end 

Вид: new.html.erb Изменение form_for так, чтобы представить волю перейдите к новому маршруту и ​​действию, а не по умолчанию Rails.

<%= form_for User, :url => {:action => "savenew"} do |f| %> 
+0

Я не мог заставить ваше решение работать для меня, но это дало мне некоторые идеи, которые я смог использовать. Благодарю. – guero64

0

Использование Rails 4.2.6 здесь (моя модель - Пользователь вместо Редактора). Следующее обходные решений (я думаю) любые разработать меры, которые могут помешать созданию нового пользователя админом:

Добавить это действие в контроллер Users:

def savenew 
    User.create_new_user(user_params) 
    redirect_to action: 'index' 
end 

Добавить этот частный метод к контроллер Пользователи, если он не существует:

private 

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

Добавьте к конфигурации/routes.rb:

match '/savenew', to: 'users#savenew', via: :post 

Добавьте этот метод класса модели User:

def self.create_new_user(params) 
    @user = User.create!(params) 
end 

У меня нет отдельного класса администратора в моем приложении. Вместо этого я определил атрибут admin для пользователей и проверил его с фильтром :validate_adminbefore_action в UserController.

Я хотел, чтобы иметь возможность создать нового пользователя с :index зрения, поэтому я добавил кнопку:

<%= button_to 'New User', '/new_user', class: 'btn btn-primary', 
          method: :get %> 

Вы, возможно, придется подправить выше решение, если у вас есть какие-либо after_create действия в модели пользователя (например, отправка приветственного письма).

Смежные вопросы