Rails 4 has_many 通过:从父模型编辑视图更新连接模型

Rails 4 has_many through: update join model from parent model edit view

在我的 Rails 4 应用程序中,我有以下模型:

class User < ActiveRecord::Base
  has_many :administrations
  has_many :calendars, through: :administrations
end

class Calendar < ActiveRecord::Base
  has_many :administrations
  has_many :users, through: :administrations
  has_many :posts
end

class Administration < ActiveRecord::Base
  belongs_to :user
  belongs_to :calendar
end

我主要是使用Administration连接模型,为每个calendar中的每个user定义一个role

因此,当 user 创建 calendar 时,或者当用户加入日历时,会在 Administration 模型中创建一个新行,其中 user_idcalendar_id 和关联的 role.

所有这些都已经处理好了。

我也知道如何删除 user 或删除 calendar,由于在两个模型中添加了 dependent: :destroy 选项,它会自动删除所有相应的管理。

现在,我感兴趣的是如何在这个特定的日历 edit 视图中为给定的 calendar 更新 userrole

注意:在此特定情况下,userrole 设置为 EditorViewer,只能更新为其他选项。

到目前为止,我已经构建了这个 table 来显示 usersbelong_to calendar:

的列表
<table id="manage_users">

  <tr>
    <th><span class="glyphicon glyphicon-user" aria-hidden="true"></span> NAME</th>
    <th><span class="glyphicon glyphicon-filter" aria-hidden="true"></span> ROLE</th>
    <th><span class="glyphicon glyphicon-time" aria-hidden="true"></span> JOINED</th>
    <th><span class="glyphicon glyphicon-cog" aria-hidden="true"></span> OPTIONS</th>
  </tr>

  <% @calendar.users.each do |user| %>

    <tr>
      <% if user.id == current_user.id %>
        <td>You</td>
        <td><%= user.administrations.find_by_calendar_id(@calendar.id).role %></td>
        <td><%= user.administrations.find_by_calendar_id(@calendar.id).created_at.strftime("%B %d, %Y") %>
        </td>
      <% else %>
        <td><%= user.first_name %> <%= user.last_name %></td>
        <td><span class="glyphicon glyphicon-user" aria-hidden="true"></span> <%= user.administrations.find_by_calendar_id(@calendar.id).role %>
        </td>
        <td><%= user.administrations.find_by_calendar_id(@calendar.id).created_at.strftime("%B %d, %Y") %>
        </td>
        <% unless user.id == user.administrations.find_by_calendar_id(@calendar.id).role %>
          <td><span class="glyphicon glyphicon-tasks" aria-hidden="true"></span> Edit Role</td>
        <% end %>
      <% end %>
    </tr>

  <% end %>

</table>

我现在纠结的地方是如何实现编辑角色功能。

我是否应该插入一种带有两个单选按钮的 "inline form"——一个用于 Editor,另一个用于 Viewer — 默认选中当前角色?

或者我应该使用带有 JS 警报的 remote: true 路线吗?

如有任何建议,我们将不胜感激。

1) 获取处理此问题的方法:

user.rb

def update_role(role)
  self.update_attributes(:role, role)
end

2) 获取控制器操作来处理此问题:

users_controller.rb

class UsersController << ApplicationController
  def update_role
    @user = User.find(params[:id])
    @user.update_role(params[:role)
  end
end

3) 获取到控制器操作的路径

route.rb

get "user/role/update" => "user#update_role"

4) 将您的 radio_buttons' 表单指向此控制器操作

<%= form_tag (url: "user/role/update" id: user.id), remote: true do %>

并在此表单中放置 role 的单选按钮,每个按钮都有不同的角色类型。

注意: 由于您已经熟悉其中大部分的工作原理,因此没有给出很多细节, 只是一些关于如何处理这个问题的建议。

希望这对您有所帮助...