2016-08-03 10 views
0

Railsアプリケーションでは、会社に所属するキャンペーンがあります。同社には多くのグループがあり、それらのグループの1つまたは複数は、:general_connectionsというモデルを通じてキャンペーンに接続できます。check_box_tagを使用してRailsでhas_many-troughの関連付けを作成または破棄する方法

このキャンペーンでは、関連する会社のグループの一覧(チェックボックス付き)を表示しようとしています。チェックボックスをオンにすると:general_connectionが作成され、チェックを外すと:general_connectiondestroyedになります。

モデル:

class Company < ActiveRecord::Base 
    has_many :campaigns 
    has_many :groups 
end 

class Campaign < ActiveRecord::Base 
    belongs_to :company 
    has_many :general_connections 
    has_many :groups, through: :general_connections 
end 

class Group < ActiveRecord::Base 
    belongs_to :company 
    has_many :general_connections 
    has_many :campaigns, through: :general_connections 
end 

class GeneralConnection < ActiveRecord::Base 
    belongs_to :campaign 
    belongs_to :group 
    belongs_to :company 
end 

コントローラ:form_tagと

#campaign_controller.rb /show 
    def show 
     @campaign = Campaign.find(params[:id]) 
    @company = Company.find(current_user.current_company) 
    @main_groups = @company.groups 
    @general_connections = @campaign.general_connections 
    @groups = @campaign.groups 
    end 

#general_connection_controller.rb /connect_group_to_campaign 
    def connect_group_to_campaign 
    group = group.find(params[:group_id]) 
    @campaign = Campaign.find(params[:id]) 
    @campaign.general_connections.create(group: group) 

    redirect_to :back 
    end 

#general_connection_controller.rb /disconnect_group_from_campaign 
    def disconnect_group_from_campaign 
    @general_connection = GeneralConnection.where("group_id = ? AND campaign_id = ?", params[:group_id], @campaign.id).first 
    group = @general_connection.oneliner 

    @general_connection.destroy 

    redirect_to :back 
    end 

ビュー:

 <h5>Groups for this campaign</h5> 
     <div class="row"> 
      <% @main_groups.each do |group| %> 
       <%= form_tag connect_group_to_campaign_path do |f| %> 
       <%= hidden_field_tag 'campaign_id', @campaign.id %> 
        <%= f.check_box_tag group.id, group.id, true %> 
       <% end %> 

       <%= form_tag disconnect_group_from_campaign_path do |f| %> 
       <%= hidden_field_tag 'campaign_id', @campaign.id %> 
        <%= f.check_box_tag group.id, group.id, false %> 
       <% end %> 

      <% end %> 
     </div> 

私はViewで私の試みは、おそらくゴミであると信じていますが、私はちょうどしたかったですまず自分で試してみてください。

私の質問は以下のとおりです。

  1. がこのさえ可能ですか?
  2. もしそうなら、私はこれをどのように構成できますか?

更新:

<%= form_for @campaign do |f| %> 
<div class="form-group"> 
    <ul> 
     <% @main_groups.each do |group| %> 
      <li> 
      <%= check_box_tag :group_id, group.id, @campaign.general_connections.include?(group) %> 
      <%= group.title %> 
      </li> 
     <% end %> 
    </ul> 
</div> 
<div class="actions"> 
    <%= f.submit "Save groups", class: "btn waves-effect waves-light" %> 
</div> 
<% end %> 

しかし、誰checkboxesが表示されていないと私は、これは私のgeneral_connections tableに行を追加するかどうかはわかりません:
はジェフの答え@でテストを行いました。

答えて

0

私は最近、あなたの説明に非常によく似た機能を完成させました。

<%= form_for(@assignment) do |a| %> 

    <%= a.label :name %> 
    <%= a.text_field :name, class: 'form-control' %> 

    <%= a.label :possible, "Points Possible" %> 
    <%= a.text_field :possible, class: 'form-control' %> 

    <%= a.label :priority %> 
    <%= a.select(:priority, [0,1,2,3], :selected =>[2]) %> 

    <% Assignment.each do |assignment| %> 
    <%= check_box_tag :preassign_ids, assignment.id, 
      @assignment.preconditions.include?(assignment), :name => 'assignment[preassign_ids][]' %> 
    <%= assignment.name %> 
    <% end %> 

    <%= a.submit "Submit", class: "btn btn-primary" %> 
<% end %> 

この例では、2つのモデルを使用しています:それはおそらくあなたのニーズに合わせて調整する重要な必要がありますが、ここでのコードは、私にとっては成功を収めまず、「割り当て」を。第2に、割り当て間の関係を作成する「前提条件」と呼ばれる結合モデルです。前提条件テーブルには、「mainassign」と「preassign」の2つの列があります。そうです:preassign_idsが出てきます。あなたのアプリの関連付けと同様の作業を行う必要があります。

このコードでは、チェックボックスをクリックすると、現在の割り当てを別の割り当てにリンクする前提条件が作成されます。私はまだチェックボックスを解除することによって関係が破壊されるかどうかをテストしていないが、最初の部分は完全に動作している。

私はかなり新しい自分なので、他のファイルのコードが役立つかどうかはわかりません。このアプローチがあなたが探しているものだと思うなら、私はもっと喜んで投稿することができます。

+0

あなたの答え、@ Jeffありがとう。私はそれを変換しようとしました。それは私に何のエラーも与えていませんが、私に 'チェックボックス'を表示していません。どの形式の 'form method'(' form_tag'や 'form_for')を使うのか分かりません:どうすれば' submit'するのですか? –

+0

私は、フォームヘッダーと送信ボタンを含め、残りのコードを追加しました。チェックボックスが表示されない場合は、考えられる原因が10個あります。最初に気になるのは、開発データベースにまだ企業がいないということです。 –

+0

もう一度@Jeffに感謝します。ソリューションのテストで質問を更新しました。まだ「チェックボックス」は表示されません。会社は問題ではないようです。 –

関連する問題