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

时间:2019-04-15 12:06:43

标签: ruby-on-rails-5.2

我有3个模型,分别为User,Role和UserRole,其控制器分别为UsersController,RolesController和UserRolesController。

我在UserRoles控制器中有一个方法,我想通过Users控制器进行访问,但是我仍然遇到错误,如下所述。

我尝试了各种方法,甚至将方法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方法。

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

例如,当我调用类似的方法时,我希望没有错误; UserRoles.add_roles_to_user(params[:user], params[:role]),但出现错误NameError (uninitialized constant Users::RegistrationsController::UserRoles):

希望一个好的撒玛利亚人会尽快帮助我。预先感谢

1 个答案:

答案 0 :(得分:0)

如果它是通用函数,则可以在应用程序控制器中定义它并调用它。另外,您可以在助手中定义。

请验证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