我该如何实施“创造”?没有' new'行动

时间:2014-08-25 06:18:14

标签: ruby-on-rails ruby ruby-on-rails-4

如何才能最好地实现此功能:作为管理员,我可以将驻地经理分配到大厅。

  • 我有一个带有命名空间路由的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

2 个答案:

答案 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 %>