用多种模型设计视图

Dan*_*iel 1 model-view-controller gravatar ruby-on-rails devise ruby-on-rails-4

我有两个模型,管理员和用户.我在devise.rb中设置了scoped views = true.我还生成了两组不同的设计视图.出于某种原因,当我点击编辑管理员注册时,它给了我一个错误

NoMethodError in Aregistrations#edit 
undefined method `email' for nil:NilClass
Run Code Online (Sandbox Code Playgroud)

它强调了这一点:

<%= gravatar_for @user %>
Run Code Online (Sandbox Code Playgroud)

并指向"app/views/devise/registrations/edit.html.erb"

在我的"config/initializer/devise.rb"文件中,它具有:

config.scoped_views = true
Run Code Online (Sandbox Code Playgroud)

在我的"config/routes.rb"文件中

devise_for :admins, :controllers => {:registrations => "aregistrations"}
devise_for :users, :controllers => {:registrations => "registrations"}, :path_prefix => 'd'
resources :users, :only =>[:show]
Run Code Online (Sandbox Code Playgroud)

在我的"app/controllers/aregistrations_controller.rb"中,我有

def update
  new_params = params.require(:admin).permit(:email, :username, :current_password, :password, :password_confirmation)
  change_password = true
  if params[:admin][:password].blank?
    params[:admin].delete("password")
    params[:admin].delete("password_confirmation")
    new_params = params.require(:admin).permit(:email, :username)
    change_password = false
  end

  @admin = Admin.find(current_admin.id)
  is_valid = false

  if change_password
    is_valid = @admin.update_with_password(new_params)
  else
    is_valid = @admin.update_without_password(new_params)
  end

  if is_valid
    set_flash_message :notice, :updated
    sign_in @admin, :bypass => true
    redirect_to after_update_path_for(@admin)
  else
    render "edit"
  end
end
Run Code Online (Sandbox Code Playgroud)

在我的视图中,我有一个devise文件夹 - 用于用户模型和admin模型的admins文件夹.

在我的"app/views/devise/registrations/edit.html.erb"中,我有

<%= gravatar_for @user %>
<a href="http://gravatar.com/emails">change</a></br></br></br></br>
Run Code Online (Sandbox Code Playgroud)

我将其设置为仅为用户编辑您的个人资料和您的重力图像.

在我的"app/views/layouts/_header.html.erb"文件中

<% if admin_signed_in? %>
<li><%= link_to "Edit Account", edit_admin_registration_path %></li>
<% else %> 
.....
<% end %>
Run Code Online (Sandbox Code Playgroud)

为什么Devise在点击编辑管理员路径并查看范围视图时会查找用户gravatar?

--------------------编辑在我的**"app/controllers/users_controller.rb"**文件中

class UsersController < ApplicationController
before_filter :authenticate_admin!, :except => [:show]

  def index
    @users = User.paginate(page: params[:page])
  end

  def show
    @user = User.find_by_username(params[:id])
    @reviews = @user.reviews.paginate(page: params[:page])
  end
end
Run Code Online (Sandbox Code Playgroud)

Dan*_*iel 5

我在另一篇文章Override Devise Registrations Controller两次的帮助下解决了这个问题我发现我需要在"app/controllers"目录中创建一个目录.这是您使用范围控制器的方式:

"应用程序/控制器/管理/ registrations_controller.rb"

class Admin::RegistrationsController < Devise::RegistrationsController
  #Your Code Here
end
Run Code Online (Sandbox Code Playgroud)

我可以离开我的第一个控制器并为用户"app/controllers/registrations_controller.rb"保留它

class RegistrationsController < Devise::RegistrationsController
  #Your Code Here
end
Run Code Online (Sandbox Code Playgroud)

我的"config/routes.rb"看起来像:

devise_for :admins, :controllers => {:registrations => "admins/registrations"}
devise_for :users, :controllers => {:registrations => "registrations"}
Run Code Online (Sandbox Code Playgroud)