调用关联的控制器方法不起作用

Calling a Associated Controller Method Not Working

我有 3 个模型,分别是 User、Role 和 UserRole,它们各自的控制器分别是 UsersController、RolesController 和 UserRolesController。

我在 UserRoles 控制器中有一个方法,我想通过用户控制器访问它,但我一直遇到错误,如下所述。

我尝试了各种方法,甚至将 def self.add_roles_to_user(user, role) 方法从 UsersRoles 控制器移动到 UserRole 模型并调用它,但我仍然遇到同样的错误。

我已经经历了很多类似的问题和各种博客,包括这个平台上的那些,例如 Calling a method from controller 和其他人,但没有很好的结果。

class UserRole < ApplicationRecord
    # many-to-many association using join table with roles and user
    belongs_to :user, inverse_of: :user_roles
    belongs_to :role, optional: true, inverse_of: :user_roles
end

class User < ApplicationRecord
    has_many :user_roles, inverse_of: :user
    has_many :roles, through: :user_roles
end

class Role < ApplicationRecord
    # table associations between role and user
    has_many :user_roles, inverse_of: :role
    has_many :users, through: :user_roles
end

class UserRolesController < ApplicationController
  def self.add_roles_to_user(user, role)
    if ! user.nil?
      if role.length > 0
        role.each do |sel_role|
          @u_role = UserRole.new
          @u_role.user_id = user_id
          @u_role.role_id = sel_role.role_id
          @u_role.save
        end
      end
    end
  end
end

class Users::RegistrationsController < Devise::RegistrationsController
    def create_user
      respond_to do |format|
        if @user.save  
           # add roles
           UserRoles.add_user_roles(params[:user], params[:role])
        end
      end
    end
end

我在添加或创建新用户时调用用户控制器中的 add_uer_to_role 方法。

我注意到,根据调用方法的方式,我不断收到不同的错误。

例如,我希望调用like方法时不会出错; UserRoles.add_roles_to_user(params[:user], params[:role]) 但它给出错误 NameError (uninitialized constant Users::RegistrationsController::UserRoles):

希望好心人尽快来救我。提前致谢

如果是普通函数,可以在application controller中定义并调用。否则你可以在 helper.

中定义

请验证Calling a method from another controller

您可以将该函数作为一个模块来使用:

# lib/common_stuff.rb
module CommonStuff
  def common_thing
    # code
  end
end

# app/controllers/my_controller.rb
require 'common_stuff'
class MyController < ApplicationController
  include CommonStuff
  # has access to common_thing
end