【问题标题】:Devise Views with Multiple Models设计具有多个模型的视图
【发布时间】:2014-01-21 16:25:09
【问题描述】:

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

NoMethodError in Aregistrations#edit 
undefined method `email' for nil:NilClass

它强调了这一点:

<%= gravatar_for @user %>

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

在我的 "config/initializer/devise.rb" 文件中:

config.scoped_views = true

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

devise_for :admins, :controllers => {:registrations => "aregistrations"}
devise_for :users, :controllers => {:registrations => "registrations"}, :path_prefix => 'd'
resources :users, :only =>[:show]

在我的 "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

在我看来,我有一个设计文件夹 - 用于用户模型和一个管理员文件夹用于管理模型。

在我的“app/views/devise/registrations/edit.html.erb”中我有

<%= gravatar_for @user %>
<a href="http://gravatar.com/emails">change</a></br></br></br></br>

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

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

<% if admin_signed_in? %>
<li><%= link_to "Edit Account", edit_admin_registration_path %></li>
<% else %> 
.....
<% end %>

为什么当我单击编辑管理员路径并具有范围视图时,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

【问题讨论】:

    标签: ruby-on-rails model-view-controller devise ruby-on-rails-4 gravatar


    【解决方案1】:

    我在另一篇帖子 Override Devise Registrations Controller Two Times? 的帮助下解决了这个问题,我发现我需要在我的 "app/controllers" 目录中创建一个目录。这就是你使用作用域控制器的方式:

    “app/controllers/admin/registrations_controller.rb”

    class Admin::RegistrationsController < Devise::RegistrationsController
      #Your Code Here
    end
    

    我可以将我的第一个控制器留给用户"app/controllers/registrations_controller.rb"

    class RegistrationsController < Devise::RegistrationsController
      #Your Code Here
    end
    

    我的 "config/routes.rb" 将如下所示:

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

    【讨论】:

    • 在 app/controllers 中有子目录的提示是设置 scoped_views 的关键。谢谢。
    【解决方案2】:

    从外观上看,User 中的方法没有正确建立。您是否尝试过重新启动服务器以正确加载配置?

    【讨论】:

    • 你的意思是 crtl c 停止服务器和 rails s 重新启动它?我已经做到了,是的
    • 你在哪里定义了@user?
    • 我添加了我的 users_controller
    • 我注意到它必须通过更改注册控制器的名称和使用 aregistrations_controller.rb 而不是 registrations_controller.rb 来做一些事情。我不知道如何让它从那里开始工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-29
    • 1970-01-01
    • 1970-01-01
    • 2019-03-11
    相关资源
    最近更新 更多