【发布时间】:2016-05-31 21:34:52
【问题描述】:
我有一个group_invitations 的多态关联。您可以邀请用户以会员身份加入product 或以客户身份加入product_customer(不是用户,类似于产品客户案例)。他们必须接受邀请才能加入。
由于它是多态的,我决定使用更多控制器而不是使用隐藏字段来执行创建操作。由于该路线操作看起来像:
products/1/group_invitations
product_customers/1/group_invitations
我的问题是我在产品展示页面上呈现了所有表单。因此很容易为特定产品呈现表单,例如:
<%= form_for([@product, GroupInvitation.new]) do %>
..........
但我坚持使用 product_customer。由于product has_many product_customers(同样不是用户,而是“产品客户案例”),用户应该选择带有集合选择的product_customer 实例,并且rails 应该基于此设置表单操作路线。我怎样才能做到这一点?有没有一种 Rails 方法可以以某种方式设置它,或者我必须使用 js/jquery?
<%= form_for( #should be set based on collection select ) do %>
<%= f.collection_select(:product_customer_id, @product.product_customers, :id, :name) %>
TL;DR 提供其余代码只是为了展示控制器/路由的外观。据我说没有必要解决问题。
routes.rb
resources :group_invitations, only: :destroy do
member do
patch :accept
end
end
resources :products do
resources :group_invitations, only: [:new, :create], module: :products
end
resources :product_customers do
resources :group_invitations, only: [:new, :create], module: :product_customers
end
产品/group_invitations_controller
class Products::GroupInvitationsController < GroupInvitationsController
before_action :set_group_invitable
private
def set_group_invitable
@group_invitable = Product.find(params[:product_id])
end
end
product_customers/group_invitations_controller
class ProductCustomers::GroupInvitationsController < GroupInvitationsController
before_action :set_group_invitable
private
def set_group_invitable
@group_invitable = ProductCustomer.find(params[:product_customer_id])
end
end
controllers/group_invitations_controller.rb
def create
@product = Product.find(params[:product_id])
@group_invitation = @group_invitable.group_invitations.new(group_invitations_params)
@group_invitation.sender = @product.owner
@group_invitation.recipient = @recipient
if @group_invitation.save
.........
【问题讨论】:
-
所以您希望表单上的路由和操作仅在用户从表单本身的下拉列表中进行选择时更改(设置)?
-
如果您有更好的想法,也可以告诉我。
标签: jquery ruby-on-rails forms routes