2016-05-31 20 views
0

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 
    ......... 
+0

フォームのルートとアクションを変更するには、ユーザーがフォームのドロップダウンから選択した場合のみ変更する(設定する)必要がありますか? – PhilVarg

+0

あなたが良いアイデアを持っていれば、私にもそれを伝えることができます。 –

答えて

0

私はこれを使用して終了:

選択コレクションで選択された値が常にあります。ページを読み込むと、最初の項目に設定されます。したがって、ユーザーがそれを変更しなければ、それはそれと共に保存されます。

<%= form_for([@product_customers.first, GroupInvitation.new]) do |f| %> 

ユーザーがコレクションselectで再生を開始すると、jqueryでルートが変更されます。

$(document).on('change', '#product-customer-collection-select', function() { 
    var newRouteId = $(this).val(); 
    var newActionURL = "/product_customers/" + newRouteId + "/group_invitations"; 
    $(this).closest("form").attr("action", newActionURL); 
}); 
関連する問題