编辑对象的关系

时间:2014-03-25 23:09:43

标签: ruby-on-rails

我在User班级和Role班级之间存在多对多关系(通过加入表UserRole)。这样我就可以将我的应用程序的部分限制为没有特定角色的用户,并且具有这些角色的用户可以访问。这是通过User类方法设置角色的方法:

def add_role(role)
    self.user_roles.build(role_id: Role.find_by(role: role).id )
end

因此user_312.add_role('general')会将general的角色添加到user_312的角色中。 (请注意,这与状态机不同,因为用户可以同时拥有许多不同的角色。)

我唯一感到困难的是如何创建一个向用户添加角色的界面。这是我的user#edit操作及其生成的视图:

控制器:

def edit
    # maybe this should be a helper method?
    roles = Role.all

    @role_names = []

    roles.each do |role|
      @role_names << role.role
    end

end

视图:

<%= form_for(@user) do |f| %>

  <div class="field">
    Current Roles: <br>
    Add Roles: <br>

  <%= f.label :roles %><br>
  <%= f.select :roles, @role_names   %>   

  <div class="actions">
    <%= f.submit %>
  </div> 

<% end %>

这为我提供了一个包含所有角色名称的精彩下拉列表,但我不知道在我的user#update操作中应该添加什么来创建所选关系:

  def update
    respond_to do |format|
      if @user.update(user_params)
        format.html { redirect_to @user, notice: 'User was successfully updated.' }
        format.json { head :no_content }
      else
        format.html { render action: 'edit' }
        format.json { render json: @user.errors, status: :unprocessable_entity }
      end
    end
  end

那么我应该在此更新操作中做些什么?

1 个答案:

答案 0 :(得分:0)

[重构]您最好使用<< ActiveRecord methodroles设置user

def add_role(role)
    new_role = Role.find_by role: role
    current_user.roles << new_role
end

在阅读完整个问题之后,这就是我要做的事情(非常简单):

#app/views/users/roles.html.erb
<%= form_for(@user) do |f| %>

  <div class="field">
    Current Roles: <br>
    Add Roles: <br>

  <%= f.label :roles %><br>
  <%= f.collection_select :roles, Role.all, :id, :role, prompt: true

  <div class="actions">
    <%= f.submit %>
  </div> 

<% end %>

#app/controllers/users_controller.rb
def update
    roles = params[:user][:roles]
    if roles.any?
        roles = Role.find(roles)
        current_user.roles << roles
    end
end

您将从中受益更多元素,但这是我开始的地方