Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 分配角色未插入到其相应的模型_Ruby On Rails_Ruby On Rails 3.2 - Fatal编程技术网

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

Ruby on rails 分配角色未插入到其相应的模型,ruby-on-rails,ruby-on-rails-3.2,Ruby On Rails,Ruby On Rails 3.2,我正在实现为用户分配角色。我通过关联实现了这一功能。该要求指出,特定用户可以有任意数量的角色。创建了用户、角色模型,并将这两者与用户角色模型链接。当我将角色分配给特定用户时,它不会保存在我的userrole表中。我的密码如下 //用户模型的index.html.erb 我使用以下用户模型的index.html.erb代码调用assign role page,我在userrole model的new.html.erb的URL中获取用户id,因此不获取用户id不是我的问题 <pre> &

我正在实现为用户分配角色。我通过关联实现了这一功能。该要求指出,特定用户可以有任意数量的角色。创建了用户、角色模型,并将这两者与用户角色模型链接。当我将角色分配给特定用户时,它不会保存在我的userrole表中。我的密码如下 //用户模型的index.html.erb

我使用以下用户模型的index.html.erb代码调用assign role page,我在userrole model的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>

因为我是ruby的婴儿,也是rails的新生儿,请引导我,即使这是一个愚蠢的错误

根据您的评论,我认为您没有将用户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 %>

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

如果你在表单中获得用户id,请尝试表单中的以下代码

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
不检查角色,而是在用户角色模型中添加验证,如下所示


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

Hi,提交表单时会发生什么?您在屏幕上看到错误了吗?您在服务器日志中看到任何输出了吗?没有,实际上它将重定向到new.html.erb。如果还有其他的部分executed@sushmithabhaskar是用户表单还是角色的单独表单?根据您的评论,您的角色似乎没有保存到数据库中,我猜这是因为您没有将
用户id
与之关联。不,它既不是用户表单,也不是角色表单。这是我正在实现的userrole表单,它有许多关联。我已经为userrole创建了一个单独的控制器,因此它的new.html.erb是userrole模型的形式谢谢。你能给我解释一下吗,@user\u id=params[:user\u id]。这是我从你的代码中写的唯一一行worked@sushmithabhaskar您正在将参数传递给控制器的操作,但若要在视图中使用它,则需要将其存储在实例变量中。比如@user\u id=params[:user\u id]。您可以使用实例变量,该变量在该操作中定义为
@variable
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
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
<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 }