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_id
、calendar_id
和关联的 role
.
所有这些都已经处理好了。
我也知道如何删除 user
或删除 calendar
,由于在两个模型中添加了 dependent: :destroy
选项,它会自动删除所有相应的管理。
现在,我感兴趣的是如何在这个特定的日历 edit
视图中为给定的 calendar
更新 user
的 role
。
注意:在此特定情况下,user
的 role
设置为 Editor 或 Viewer,只能更新为其他选项。
到目前为止,我已经构建了这个 table 来显示 users
谁 belong_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
的单选按钮,每个按钮都有不同的角色类型。
注意: 由于您已经熟悉其中大部分的工作原理,因此没有给出很多细节, 只是一些关于如何处理这个问题的建议。
希望这对您有所帮助...
在我的 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_id
、calendar_id
和关联的 role
.
所有这些都已经处理好了。
我也知道如何删除 user
或删除 calendar
,由于在两个模型中添加了 dependent: :destroy
选项,它会自动删除所有相应的管理。
现在,我感兴趣的是如何在这个特定的日历 edit
视图中为给定的 calendar
更新 user
的 role
。
注意:在此特定情况下,user
的 role
设置为 Editor 或 Viewer,只能更新为其他选项。
到目前为止,我已经构建了这个 table 来显示 users
谁 belong_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
的单选按钮,每个按钮都有不同的角色类型。
注意: 由于您已经熟悉其中大部分的工作原理,因此没有给出很多细节, 只是一些关于如何处理这个问题的建议。
希望这对您有所帮助...