2012-04-14 23 views
1

この関係は、ユーザーがドキュメントを作成して他のユーザーをそのドキュメントに属するグループに招待できる場合に発生します。私の関係は、「グループ」にuser_idとtrip_idの列があることを示しています。したがって、招待するすべてのユーザーに対して、新しいグループレコードがデータベースに作成されます。ユーザーがすでに「グループ」関係に属している場合、反復中にユーザーが表示されない

他のユーザーを招待しているときは、グループに属していないユーザーのみが表示されます。すでにグループに入っているユーザーは表示されませんが、私のビューにはユーザーが表示されます。

私は<% if !friend.trips.include?(@trip)%>で遊んでいましたが、正しい表示が得られないようです。レコードがデータベースに正しく作成されています。

また、私がgroups/new.html.erbを表示しているとき、これはURLがhttp://localhost:3000/groups/new?id=2で、idはtrip_idです。

私の質問:私は安らかな規則を使用して

  1. アム?つまり、ここで新しいメソッドを使用するか(そうでなければ)、代わりにインデックスメソッドを使用する必要がありますか?
  2. どのようにグループのtrip_idに@ trip.idに相当するものがないことを確認するために、各友人のグループを反復処理しますか?

ありがとう!

ビュー(/groups/new.html.erb)

<% if [email protected]? %> 
    <% @friends.each do |friend| %> 
    <% if !friend.trips.include?(@trip)%> 
      <%= link_to groups_path(:user_id => friend.id, :trip_id => @trip.id), 
            :method => :post, :action => 'create' do %> 
      <div id="addfriend_totrip_button_groupsnew">add friend to trip</div> 
      <% end %> 
    <% end %> 
    <% end %> 
<% end %> 

groups_controller.rb

class GroupsController < ApplicationController 
before_filter :authenticate, :only => [:update, :create, :destroy] 

    def new 
    @trip = Trip.find(params[:id]) 
    @user = User.find(current_user) 
    @group = Group.new 
    @friends = @user.friends.all 
    end 

    def create 
    @trip = Trip.find(params[:trip_id]) 
    @user = User.find(params[:user_id]) 
    @group = Group.create(:user_id => @user.id, :trip_id => @trip.id) 

    if @group.save 
     flash[:success] = "Friend added to group." 
     redirect_to groups_path(:id => @trip.id) 
    else 
     flash[:error] = "Could not add friend." 
     redirect_to root_path 
    end 
    end 

end 

user.rb

class User < ActiveRecord::Base 
    has_many :trips, :through => :groups 
    has_many :trips, :dependent => :destroy 
    has_many :groups 
end 

trip.rb

class Trip < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :traveldeal 
    has_many :groups 

    has_many :users, :through => :groups 
end 
すべての

group.rb

class Group < ActiveRecord::Base 
    belongs_to :trip 
    belongs_to :user 
end 

答えて

1

まず、あなたはあなたのUserモデルで二回と呼ばれるhas_many :tripsを持っています。 User - Tripの2種類のリレーションシップ(1つは直接、もう1つはGroup)がありますが、両方を同じ名前にすることはできません。

class User < ActiveRecord::Base 
    has_many :group_trips, :through => :groups, 
         :class_name => "Trip" 
    has_many :trips, :dependent => :destroy 
    has_many :groups 

    def all_trips 
    Trip.joins(:groups).where({:user_id => self.id} | {:groups => {:user_id => self.id}}) 
    end 
end 

あなたはTripオブジェクトのgroupsfriendのリストを検索している問題があります:このようなあなたのUserモデルを定義してみてください。このようなものが動作するはずです、

<% if !friend.all_trips.include?(@trip) %> 

たり、新しい方法なし::にその行を変更してみてください

<% if !friend.groups.where(:trip_id => @trip.id).first %> 

私はあなたのアプローチについて、非RESTfulな何も表示されません。 RESTfulは一般的にステートレスを意味します。私。応答が依存するのはHTTPメソッドとアドレスだけです。したがって、あなたの状態情報を、例えばセッションに保持しない限り、あなたはRESTに従うべきです。

+0

私は '<%if!friend.trips.include?(@ trip)%>'を使ってみましたが、動作しませんでした。すべてのユーザーはまだ表示されていました。あなたの他のソリューション '<%if!friend.groups.where(:trip_id => @ trip.id).first%>'が成功しました。 。まずは何をするのですか? – Huy

+0

私のルートのために最初のものが動作しなかったと思いますか? – Huy

+0

'.first'は最初のものをデータベースから取り出します。実際にクエリを実行し、オブジェクトを処理していることを確認します。もしあなたがそれをしなかったなら、あなたはいつも「真」とみなされるArelオブジェクトをすべてのケースで扱うでしょう。 – tsherif

関連する問題