group_invitations
の多型関連があります。あなたは会員としてproduct
に加入するか、顧客としてproduct_customer
(それはユーザーではなく、製品顧客のようなものです)に参加するようにユーザーを招待できます。参加するには招待状を受け入れなければなりません。レールを設定する動作ルートを介して動的にコレクションを選択
多様なので、私は、隠しフィールドを使うのではなく、より多くのコントローラで作成アクションを行うことに決めました。そのルートのおかげで、アクションは次のようになります。
私の問題は、製品の表示ページですべてのフォームをレンダリングすることです。したがって、次のような特定の製品のフォームをレンダリングするのは簡単です。
<%= form_for([@product, GroupInvitation.new]) do %>
..........
しかし、私はproduct_customerに悩まされています。 product has_many product_customers
(これはユーザーではなく、 "製品の顧客のケース"です)から、コレクション選択でproduct_customer
インスタンスを選択する必要があります。レールはそれに基づいてフォームアクションルートを設定する必要があります。それをどうすれば実現できますか?何とかそれを設定するためのレールの方法はありますか?または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
コントローラ/ 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
.........
フォームのルートとアクションを変更するには、ユーザーがフォームのドロップダウンから選択した場合のみ変更する(設定する)必要がありますか? – PhilVarg
あなたが良いアイデアを持っていれば、私にもそれを伝えることができます。 –