分配角色未插入到其相应的模型

Posted

技术标签:

【中文标题】分配角色未插入到其相应的模型【英文标题】:Assigning role is not inserting to its corresponding model 【发布时间】:2019-06-17 23:05:08 【问题描述】:

我正在为用户分配角色。我已经实现了这个使用有很多通过关联。该要求表示特定用户可以有任意数量的角色。已经创建了用户、角色模型并将这两者与用户角色模型相关联。当我将角色分配给特定用户时,它不会保存在我的用户角色表中。我的代码如下 //用户模型的index.html.erb

我正在使用用户模型的 index.html.erb 的以下代码调用分配角色页面,我在 userrole 模型的 new.html.erb 的 URL 中获取用户 ID,所以没有获取用户 ID 是不是我的问题。

<pre>
<%= link_to t('.assign_role', default: t("helpers.links.assign")),
                  new_user_role_path(user_id: user.id,user_name: user.first_name),
                 method: :get,
                 class: 'btn btn-default btn-xs' %>
</pre>

//new.html.erb

<h1>Assign Roles to <%=params[:user_name ]%></h1>
<%= form_for @user_role, :html =>  :class => "form-horizontal user"  do |f| %>

    <div class="form-group">
        <%= f.label :Assign_Role_1, :class => 'control-label col-lg-2' %>
        <div class="col-lg-10" >
            <%= f.select(:role_id, Role.all.map|e| [e.name, e.id], :include_blank => "Please select" ,  class: 'form-control'  ) %>
        </div>
        <%=f.error_span(:Assign_Role) %>
    </div>


    <div class="form-group">
      <div class="col-lg-offset-2 col-lg-10">
        <%= f.submit nil, :class => 'btn btn-primary' %>
        <%= link_to t('.cancel', :default => t("helpers.links.cancel")),
                  users_path, :class => 'btn btn-default' %>
      </div>
    </div>

  <% end %>

//控制器

   class UserRolesController < ApplicationController   

    def index
    @user_role = UserRole.all   
    end

    def new
    @user_role = UserRole.new   
    end

     def create  
      @user_role = UserRole.new(user_role_params)
        if UserRole.exists?(user_id: user_role_params[:user_id]) 
              flash[:error] = "User already exists."
              redirect_to '/' and return
        end
        if @user_role.save
              flash[:success] = "New UserRole created."
              redirect_to @user_role
        else
              render 'new'
        end
     end

     def edit   
     end

     def destroy  
     end

     def show
       @user_role = UserRole.all   
     end


  private  
     def user_role_params
        params.require(:user_role).permit( :role_id,:user_id
                                 )   
     end

结束

我的桌子

create_table "user_roles", force: :cascade do |t|
    t.integer "role_id"
    t.integer "user_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["role_id"], name: "index_user_roles_on_role_id"
    t.index ["user_id"], name: "index_user_roles_on_user_id"
  end

由于我是 ruby​​ 中的婴儿和刚出生的孩子,即使是愚蠢的错误,也请指导我。

【问题讨论】:

您好,当您提交表单时会发生什么?您在屏幕上看到错误吗?您在服务器日志中看到任何输出吗? 不,实际上它会重定向到 new.html.erb。 if 的 else 部分正在执行 @sushmithabhaskar 是用户表单还是仅用于角色的单独表单? 根据您的评论,您的角色似乎没有保存到数据库中,我猜这是因为您没有将user_id 与它关联。 不,它既不是用户表单也不是角色表单。这是我实现它的用户角色表单,它有很多通过关联。我为用户角色创建了一个单独的控制器,因此它的 new.html.erb 是用户角色模型的形式 【参考方案1】:

如果您在表单中获取 user_id,请尝试在表单中使用以下代码

<h1>Assign Roles to <%=params[:user_name ]%></h1>
<%= form_for @user_role, :html =>  :class => "form-horizontal user"  do |f| %>
    <%= f.hidden_field :user_id, value: @user_id %>
    <div class="form-group">
        <%= f.label :Assign_Role_1, :class => 'control-label col-lg-2' %>
        <div class="col-lg-10" >
            <%= f.select(:role_id, Role.all.map|e| [e.name, e.id], :include_blank => "Please select" ,  class: 'form-control'  ) %>
        </div>
        <%=f.error_span(:Assign_Role) %>
    </div>


    <div class="form-group">
      <div class="col-lg-offset-2 col-lg-10">
        <%= f.submit nil, :class => 'btn btn-primary' %>
        <%= link_to t('.cancel', :default => t("helpers.links.cancel")),
                  users_path, :class => 'btn btn-default' %>
      </div>
    </div>

  <% end %>

在你的控制器中

def new
  @user_id = params[:user_id]
  @user_role = UserRole.new   
end

def create  
  @user_role = UserRole.new(user_role_params)
    if UserRole.exists?(user_id: user_role_params[:user_id]) 
          flash[:error] = "User already exists."
          redirect_to '/' and return
    end
    if @user_role.save
          flash[:success] = "New UserRole created."
          redirect_to @user_role
    else
          render 'new'
    end
end

private  
 def user_role_params
    params.require(:user_role).permit( :role_id,:user_id
                             )   
 end

在您的用户角色模型中添加验证而不是检查角色,如下所示

  validates :role_id, uniqueness:  scope: :user_id 

或者如果可能,不要在选择框中显示该用户已经存在的角色

【讨论】:

谢谢。你能解释一下吗,@user_id = params[:user_id]。这是我从您的代码中输入的唯一一行,并且有效 @sushmithabhaskar 您正在将参数传递给控制器​​的操作,但如果您想在视图中使用它,您需要将其存储在实例变量中。像 @user_id = params[:user_id] 。鉴于该操作,您可以使用定义为 @variable 的实例变量【参考方案2】:

根据您的 cmets,我认为您没有将 user_id 传递给控制器​​。尝试以下方法:

def new
  # Get the user somehow
  user = User.find_by(name: params[:user_name])
  # associate the new role with the user
  @user_role = user.user_roles.new   
end

def create
  # Get the user somehow
  user = User.find_by(name: params[:user_name])

  # associate the new role with the user
  @user_role = user.user_roles.new(user_role_params)

  if @user_role.save
    flash[:success] = "New UserRole created."
    redirect_to @user_role
  else
    render 'new'
  end
end

您可能需要对此进行试验,因为您的设置有点不寻常。但你会到达那里:)。祝你好运。

【讨论】:

以上是关于分配角色未插入到其相应的模型的主要内容,如果未能解决你的问题,请参考以下文章

简单设计一个RBAC权限权限模型

简单设计一个RBAC权限权限模型

Xadmin权限管理

在 Keycloak 中创建新用户期间未分配客户端角色

项目一众筹网06_02给用户分配角色执行用户角色的分配提交的 只是我们选中的解决隐藏域的东西,不用传,点击submit的时候就会传过去允许参数是空值mybatis删除和插入数据

帮助在特定模型实例中为用户分配角色的数据库策略