2016-12-23 72 views
0

我向用戶添加了角色,註冊後自動將我發回主頁。我嘗試了很多來自這個網站和過去的問題,但似乎沒有任何工作。也許我在想這件事,我是新來的。基本上,我希望註冊的人選擇他們的角色,如果他們是一位老師,他們將創建一個新班級('教室#新'),學生將選擇他們的班級('班級#索引')。我按照建議創建了一個單獨的註冊控制器,但它沒有工作。與設計註冊後重定向的問題。該怎麼辦?

註冊表格(new.html.erb)

<div class="authform"> 
    <%= form_for(resource, :as => resource_name, :url => registration_path(resource_name), :html => { :role => 'form'}) do |f| %> 
    <h2>Sign Up</h2> 
    <%= devise_error_messages! %> 
    <div class="form-group"> 
     <%= f.label :name %> 
     <%= f.text_field :name, :autofocus => true, class: 'form-control' %> 
    </div> 
    <div class="form-group"> 
     <%= f.label :email %> 
     <%= f.email_field :email, class: 'form-control' %> 
    </div> 
    <div class="form-group"> 
     <%= f.label :password %> 
     <%= f.password_field :password, class: 'form-control' %> 
    </div> 
    <div class="form-group"> 
     <%= f.label :password_confirmation %> 
     <%= f.password_field :password_confirmation, class: 'form-control' %> 
    </div> 
    <div> 
     <%= f.radio_button :role, 'student' %> 
     <%= label :role_student, 'Student' %> 

     <%= f.radio_button :role, 'teacher' %> 
     <%= label :role_teacher, 'teacher' %> 
    </div> 
    <%= f.submit 'Sign Up', :class => 'button right' %> 

    <% end %> 
</div> 

這裏是我註冊的控制器:

class Devise::RegistrationsController < DeviseController 
    def after_sign_up_path_for(resource) 
    if params[:user][:role] == 'student' 
     redirect_to 'classroom#index' 
    elsif [:user][:role] == 'teacher' 
     redirect_to 'classroom#new' 
    end 
    end 
end 

這裏是我的用戶控制器

class UsersController < ApplicationController 
    before_action :authenticate_user! 
    after_action :verify_authorized 
    before_filter :check_role 

    def show 
    @user = User.find(params[:id]) 
    authorize @user 
    @posts = @user.posts 
    end 

    def new 
    @user = User.new 
    authorize @user 
    end 

    def check_role 
    if params[:user][:role] == 'student' 
     redirect_to 'classroom#index' 
    elsif [:user][:role] == 'teacher' 
     redirect_to 'classroom#new' 
    end 
    end 

    def update 
    @user = User.find(params[:id]) 
    authorize @user 
    if @user.update_attributes(secure_params) 
     redirect_to users_path, :notice => "User updated." 
    else 
     redirect_to users_path, :alert => "Unable to update user." 
    end 
    end 

    def destroy 
    user = User.find(params[:id]) 
    # authorize @user 
    user.destroy 
    redirect_to users_path, :notice => "User deleted." 
    end 

    def create_user_type 
    end 

    private 

    def secure_params 
    params.require(:user).permit(:role) 
    end 
end 

編輯:這是我的路線頁面

Rails.application.routes.draw do 
    get 'students/new' 

    get 'classrooms/new' 

    get 'teachers/new' 

    devise_for :users 
    resources :users 
    get "edit_profile" => "devise/registrations#edit" 
    resources :posts 
    resources :teachers 

    post 'users/create_user_type' => 'users/create_user_type' 
    root to: 'visitors#index' 
end 

我知道有與檢查角色重複的代碼,我剛剛被合併在一起的答案(這是不好的,我知道)

+0

嘗試將'after_sign_up_path_for'移動到'application_controller',並適當調整路由。 – 31piy

回答

0

使用撬寶石與binding.pry來檢查你的代碼&變量的內容。

不管怎樣,我想這個角色是用戶,爲什麼你不檢查

user.teacher? 
user.student? 

代替

params[''][''] 

資源屬性的屬性是持久性的,而不是PARAMS內容

0

我認爲你的註冊控制器不正確。 如果你創建自己的註冊控制器,您希望它覆蓋從設計出註冊控制器:

class RegistrationsController < Devise::RegistrationsController 
def after_sign_up_path_for(resource) 
    if params[:user][:role] == 'student' 
    redirect_to 'classroom#index' 
    elsif [:user][:role] == 'teacher' 
    redirect_to 'classroom#new' 
    end 
end 
end 

然後在你的路線,你必須確保它也使用自己的註冊控制器:

devise_for :users, controllers: {registrations: 'registrations'} 

希望這會幫助你。