gpt4 book ai didi

ruby-on-rails - 设计中的多个模型

转载 作者:行者123 更新时间:2023-12-04 02:43:47 30 4
gpt4 key购买 nike

我正在尝试在 Devise 中创建多个模型(使用 Ruby 2.0、Rails 4)。我搜索过 Stack Overflow 并尝试过 Google,但大多数人最终都使用了继承或 CanCan。

问题是我需要两种完全不同的模型才能以两种完全不同的方式注册和使用我的网站——一种使用电子邮件或用户名登录,并具有各种管理能力(例如查看MobileUser 使用情况等的图表)。另一个只能从移动设备访问,使用电话号码登录,界面更简单。

我尝试为两者(“rails g devise WebUser”和“rails g devise MobileUser”)运行 Devise。我现在有两者的表和列,但只有路由和 WebUser 的模型。我尝试为 MobileUser 手动添加路由和模型,但没有任何效果 - 模型未连接到表,路由产生运行时错误('WebUser 不响应 'devise' 方法)。

我读过的所有内容都表明我可以让 Devise 在我的一个网站上为两个模型工作 - 我该如何实现它?

我的路线:

Mailer::Application.routes.draw do
devise_for :web_users
# devise_for :mobile_users (doesn't work, so it is commented out)

resources 'web_users', only: [:show, :index]
resources 'mobile_users', only: [:show, :index]

root 'static_pages#home'

match '/contact', to: 'static_pages#contact', via: 'get'
match '/faq', to: 'static_pages#faq', via: 'get'
end

最佳答案

我知道这是一个非常古老的问题,但也许它会对 2019 年 Devise 支持的人有所帮助 devise_group .

Thins 使得使用多个 Devise 模型变得非常容易。我有如下所示的三种不同的设计模型:

用户.rb

class User < ApplicationRecord
has_many :messages

# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :recoverable, :rememberable, :trackable, :validatable
end

Organizer.rb

class Organizer < ApplicationRecord
has_one :organizer_profile, dependent: :destroy, autosave: true, inverse_of: :organizer
has_many :brochures, dependent: :destroy
has_many :messages, as: :messageable

# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable, :confirmable
end

赞助商.rb

class Sponsor < ApplicationRecord
has_one :sponsor_profile, dependent: :destroy, autosave: true, inverse_of: :sponsor
has_many :sponsorings
has_many :brochures, through: :sponsorings

# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable, :confirmable

scope :approved, -> { where(approved: true) }

# Allow saving of attributes on associated records through the parent,
# :autosave option is automatically enabled on every association
accepts_nested_attributes_for :sponsor_profile
end

routes.rb

Rails.application.routes.draw do
# Deviseable resources
devise_for :organizers, controllers: {registrations: "organizers/registrations"}
devise_for :sponsors, controllers: {registrations: "sponsors/registrations"}
devise_for :users

root "welcome#index"
end

现在我不能使用相同的 authenticate_user!user_signed_in? 甚至 current_user。那么现在,我怎么知道是否有用户登录?我们可能需要做一些像 user_signed_in? ||组织者_signed_in? || sponsor_signed_in? 但重复代码太多了。

感谢 devise_group 选项,我们可以简化这个工作流程!

在您的 application_controller.rb 中添加:

class ApplicationController < ActionController::Base
# Devise working with multiple models.
# Define authentication filters and accessor helpers for a group of mappings.
devise_group :member, contains: [:organizer, :sponsor, :user]

private

def pundit_user
# Make Pundit to use whichever Devise model [Organizer, Sponsor, User] as the 'current_user'
# Just by using the offered helper method from Devise, 'devise_group' feature
current_member
end
end

现在您可以使用通用助手 authenticate_member!member_signed_in? 甚至 current_member 在需要时验证任何 Devise 用户。或者您仍然可以像往常一样为每种类型的 Devise 用户使用单独的帮助程序。

希望对大家有用!

关于ruby-on-rails - 设计中的多个模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19306731/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com