Разрешить пользователю добавлять новых пользователей в Devise и оставаться в системе как они сами

Я использую Ruby On Rails с Devise, Rails 4.1.0.rc1, Ruby 2.1.0p0, devise-3.2.4

Я следил за учебником из Rails Cast Episode #209, чтобы установить и работать. Я могу войти, выйти из системы и зарегистрировать новых пользователей.

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

после этого сообщения в блоге я добавил пользовательский контроллер и представления, чтобы добавить дополнительные функции, такие как список всех пользователей, которых я не видел с devise. https://github.com/danweller18/devise/wiki/Allow-Users-to-View-Profile-and-List-All-Users

Я также рассмотрел эти вопросы на переполнение стека: позволяет администраторам добавлять пользователей с Devise как настроить контроллер для регистрации в Devise? Ruby on Rails: пользовательский контроллер регистрации, запрашивающий создание действия

Я новичок в ruby on rails с 1 марта этого года, и приняли Майк & Николь Clarks Rails 1 & Rails 2 онлайн-курсы.

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

происходит то, что я могу войти в систему, добавить нового "пользователя" через new_user_path и представление пользователя (в отличие от представления devise), но когда Я отправляю его, затем я вошел в систему как новый пользователь. Предыдущие пользователи не являются постоянными.

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

любая помощь приветствуется.

вот мой пользовательский контроллер:

class UsersController < ApplicationController

    def index
        @users = User.all
    end

    def show
      @user = User.find_by_id(params[:id])
    end

    def new
        @user = User.new
    end

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

    def update
        @user = User.find(params[:id])
        if @user.update_attributes(user_params)
            redirect_to user_url, notice: "Updated User."
        else
            render :edit
        end
    end

    def create
        @user = User.new(user_params)
        if @user.save
            redirect_to user_url, notice: "User succesfully created!" 
        else
            render :new
        end
    end






private

def user_params
  params.require(:user).permit(:first_name, :last_name, :img_file_name, :email, :password, :password_confirmation, :birthdate)
end
end

вот мой контроллер приложения :

class ApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  protect_from_forgery with: :exception

before_action :configure_permitted_parameters, if: :devise_controller?


protected

    def configure_permitted_parameters
        devise_parameter_sanitizer.for(:account_update) {|u| 
            u.permit(:first_name, :last_name, :birthdate, :img_file_name, :email, :password, :password_confirmation, :current_password)}
        devise_parameter_sanitizer.for(:sign_up) {|u| 
            u.permit(:first_name, :last_name, :birthdate, :img_file_name, :email, :password, :password_confirmation, :current_password)}
    end




end

вот мой новый пользователь.формат html.erb-файл: (только администраторы-это просто напоминание для меня прямо сейчас, в них нет функции администратора)

<header id="content-header">
  <h1>Create a New User (Admins Only)</h1>
</header>

<%= render 'form' %>

вот и _form.формат html.Эрб

<%= form_for(@user) do |f| %>
  <%= render "shared/errors", object: @user %>
  <fieldset>
    <ol>

      <li class="required">
        <%= f.label :first_name %>
        <%= f.text_field :first_name, size: 40, autofocus: true %>
      </li>
      <li class="required">
        <%= f.label :last_name %>
        <%= f.text_field :last_name, size: 40 %>
      </li>
      <li class="required">
        <%= f.label :email %>
        <%= f.email_field :email, size: 40 %>
      </li>
      <li class="required">
        <%= f.label :password %>
        <%= f.password_field :password, size: 40 %>
      </li>
      <li class="required">
        <%= f.label :password_confirmation, "Confirm Password" %>
        <%= f.password_field :password_confirmation, size: 40 %>
      </li>
      <li >
        <%= f.label :birthdate %><br/>
        <%= f.date_select :birthdate, start_year: 1915 %><br/>
      </li>

      <li >
          <%= f.label :img_file_name %><br/>
          <%= f.text_field :img_file_name %>
      </li>

    </ol>
    <p>
      <% if @user.new_record? %>
        <%= f.submit "Create Account" %>
      <% else %>
        <%= f.submit "Update Account" %>
      <% end %>
      <%= link_to "Cancel", users_path, class: 'button' %>
    </p>
  </fieldset>
<% end %>

4 ответов


я думаю, что проблема на самом деле с вашей стороны. Я полагаю, что вы добавили resources :users в файл маршрутов, чтобы настроить маршруты для вашего UsersController. Тем не менее, я предполагаю, что у вас также есть devise_for :users … настроить devise. Это означает, что у вас будет devise и ваш UsersController борьба за те же маршруты. В частности, вы ожидаете, что сообщение /пользователи создадут нового пользователя, но на самом деле это маршрутизация для разработки RegistrationsController и регистрации нового пользователя и их подписи в.

вы можете увидеть это, запустив rake routes и видя, что и devise и ваш UsersController имеют, например, сопоставления для POST /users(.:format). Вам нужно разделить два набора маршрутов. Есть разные способы сделать это. Вы можете добавить :path => 'u' на devise_for в строке routes.rb, что будет означать, что ваши маршруты разработки все /u вместо /users. Кроме того, вы можете продолжать разрабатывать маршруты на /users и вместо этого измените маршруты UsersController на что-то вроде:

resources :users_admin, :controller => 'users'

какой будет карте /users_admin для вашего UsersController (но обратите внимание, что помощники пути также изменятся, например users_path to users_admin_path).


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

в маршрутах.rb

  devise_for :users  
  resources :users_admin, :controller => 'users'

в users_controller.рубидий никаких изменений

в форме.формат html.Эрб для добавления новых и обновления пользователей. Обратите внимание на указанный URL. Это документировано в некоторой степени здесь, но упоминает об этом только для особых ресурсов http://guides.rubyonrails.org/routing.html

однако мне пришлось отделить edit & new пути, поскольку url-адрес не будет работать как в create & update в то же время, поэтому вместо частичного рендеринга у меня есть только 2 формы. Не уверен, что обходной путь.

Это моя новая форма пользователя:

<%= form_for @user, url: users_admin_index_path(@user)  do |f| %> 

и это в моей форме редактирования пользователя:

<%= form_for @user, url: users_admin_path(@user)  do |f| %>  

в нижней части формы у меня есть этот код:

 <% if @user.new_record? %>
        <%= f.submit "Create Account" %>
      <% else %>
        <%= f.submit "Update Account" %>
      <% end %>
      <%= link_to "Cancel", users_admin_index_path, class: 'button' %>
    </p>

затем в шоу.формат html.форма erb я должен был указать URL-адреса из "rake routes"

<footer>
  <nav>
    <%= link_to "Edit User", edit_users_admin_path, class: 'button' %> |
    <%= link_to "New User", new_users_admin_path, class: 'button' %> | 
    <%= link_to "All Users", users_admin_index_path, class: 'button' %>
  </nav>
</footer>

я получил имена путей от rake routes.

надеюсь, это поможет кого-нибудь, и спасибо всем за помощь. У меня еще недостаточно репутации, чтобы давать какие-то ответы.


Как я понял ваш вопрос(текст, не прочитать код), вы хотите, чтобы пользователи добавить пользователи и учетные записи должны быть готовы к использованию. Чтобы зарегистрироваться с помощью devise, вы будете использовать user email, password and password_confirmation field as mandatory.

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


GhostRider является правильным в рабочем процессе. Вы также можете переместить логику в AdminsController или аналогичный. Этот поток решит конкретную проблему входа в систему как этого пользователя:Devise: как создать нового пользователя, который уже вошел в систему?

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