如何才能最好地实现此功能:作为管理员,我可以将驻地经理分配到大厅。
我有一个带有命名空间路由的User模型,用于admin -I打算使用另一个命名空间路由来保存RM的功能 -
我有一个霍尔模型。
由于上面与模型之间有很多关系,我有一个管理连接模型,它只包含user_id和hall_id列。
我知道实现上述功能,需要在管理表中创建新记录,但我不知道该怎么做。我没想到使用表单(管理#new)会解决这个问题,因为管理员不应该知道user_ids / hall_ids ...
以下是我要做的事情,但我能做到这一点
当管理员进入用户索引页面时,他/她应该看到每个用户的Hall Assignment链接。此链接指向该特定用户的管理显示页面,该页面将显示分配给该用户的大厅列表,并且还显示未分配给该用户的所有其他剩余大厅。因此,无论是点击添加按钮还是在大厅的名称上,都应将其添加到同一页面上该用户指定的大厅列表中。
管理#show页面
<h2><%= @user.email %>'s assigned halls</h2>
<% @user.managements.each do |management| %>
<%= management.hall.name %>
<% end %>
<p> HALL LISTS </p>
<ul>
<% @halls.each do |hall| %>
<li><%= hall.name %> <%= button_to "Add" %> </li>
<% end %>
</ul>
这是我的管理控制器
class Admin::ManagementsController < ApplicationController
def index
@managements = Management.all
end
def show
@user = User.find(params[:id])
@halls = Hall.all
end
def create
@management = Management.create(managements_params)
redirect_to admin_management_path
end
private
def managements_params
params.
require(:management).
permit(user_id: params[:user_id], hall_id: params[:hall_id])
end
end
这是我的路线文件的一部分:
namespace :admin do
resources :users, only: [:index, :update]
resources :halls, only: [:index, :new, :create]
resources :managements, only: [:index, :new, :create, :show] do
resources :halls, only: [:index]
end
end
答案 0 :(得分:4)
您的“添加”按钮只是一个迷你形式(主要是隐藏字段)。您只需将其设为实际表单(提交按钮的文本为“添加”),并从页面上的项目填充id值...它只指向您通常使用的相同路径指向您在new
模板中找到的表单。
如果您想了解更多细节,请告诉我们您编写的代码(而不是对其进行口头描述)。
编辑:
好的,所以你在这个页面上放了一个按钮
<ul>
<% @halls.each do |hall| %>
<li><%= hall.name %> <%= button_to "Add", managements_path(management: {user_id: @user.id, hall_id: hall.id}, method: :put ) %> </li>
<% end %>
</ul>
请注意managements_path - 您可能需要检查该路由是否正确(请根据rake routes
中的内容进行检查)。请注意,您要传递用户ID和大厅ID,并且必须将方法设置为“放置”按钮。
答案 1 :(得分:1)
首先要做的事情 -
如何在没有“新”操作的情况下实施“创建”操作
这样做相对简单 - 您需要在某处执行create
操作,但new
操作只是为控制器构建相应ActiveRecord对象的一种方法。
如果您在其他操作中执行此操作,则只需确保将form
指向正确的create
操作(以及create
操作以重定向回
-
New
/ Create
以下是您可以在不同控制器中处理新/创建操作的方法,例如:
#app/controllers/users_controller.rb
Class UsersController < ApplicationController
def index
@hall = Hall.new
end
end
#app/controllers/halls_controller.rb
Class HallsController < ApplicationController
def create
@hall = Hall.new hall_params
redirect_to users_path if @hall.save
end
private
def hall_params
params.require(:hall).(:hall, :attributes, :user_id)
end
end
这将允许您显示以下内容:
#app/views/users/index.html.erb
<% @users.each do |user| %>
<%= link_to user.name, user %>
<%= form_for @hall, url: hall_path do |f| %>
<%= f.hidden_field :user_id, value: user.id %>
<%= f.text_field :x %>
<%= f.submit %>
<% end %>
<% end %>
-
<强>修正强>
ADD按钮或大厅名称应将其添加到该用户指定的大厅列表
为此,我认为你不需要在“传统”意义上采取create
行动 - 它更多的是为用户现有的大厅增加新的大厅。这与创建新的hall
本身有很大不同:
#config/routes.rb
namespace :admin do
resources :users do
post "hall/:id", to: :add_all #=> domain.com/admin/users/:user_id/hall/:id
end
end
#app/controllers/admin/users_controller.rb
Class UsersController < ApplicationController
def add_hall
@user = User.find params[:user_id]
@hall = Hall.find params[:id]
@user.halls << @hall
end
end
#app/models/user.rb
Class User < ActiveRecord::Base
has_many :user_halls
has_many :halls, through: :user_halls
end
#app/models/hall.rb
Class Hall < ActiveRecord::Base
has_many :user_halls
has_many :users, through: :user_halls
end
#app/models/user_hall.rb
Class UserHall < ActiveRecord::Base
belongs_to :user
belongs_to :hall
end
这使用ActiveRecord collection methods来完成这项工作,您将能够提供以下内容:
#app/views/users/index.html.erb
<% @users.each do |user| %>
<%= link_to user.name, user %>
<%= button_to "Add Hall Test", user_add_hall_path(user, 1) %>
<% end %>