Назначающая роль не вставляется в соответствующую модель - PullRequest
0 голосов
/ 24 января 2019

Я реализую Назначение ролей пользователю. Я реализовал это с помощью многих через ассоциацию. требование говорит, что может быть любое количество ролей для конкретного пользователя. создали User, Role model и связали их с моделью userrole. когда я назначаю роли определенному пользователю, это не сохраняется в моей таблице userrole. и мой код задница следует //index.html.erb пользовательской модели

Я вызываю страницу назначения роли со следующим кодом index.html.erb, который относится к модели User. Я получаю идентификатор пользователя в URL-адресе new.html.erb модели userrole, поэтому не получается идентификатор пользователя. не моя проблема.

<code><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' %>

// 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

, поскольку я ребёнок в рубине и новорожденный от рельсов, пожалуйста, наведите меня, даже если это глупая ошибка

Ответы [ 2 ]

0 голосов
/ 24 января 2019

если вы получаете 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 }

Или, если возможно, не показывать роли в окне выбора, которые уже присутствуют для этого пользователя

0 голосов
/ 24 января 2019

Судя по вашим комментариям, я не думаю, что вы передаете 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

Возможно, вам придется поэкспериментировать с этим, поскольку ваши настройки немного необычны. Но вы попадете туда :). Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...