1

私には、ユーザーがドキュメント(トリップ)を作成し、そのドキュメントに属するグループに他のユーザーを招待できるという関係があります。私の関係は、「グループ」にuser_id列とtrip_id列があることを示しているため、招待するすべてのユーザーに対して、新しいグループレコードがデータベースに作成されます。

他のユーザーを招待するときは、グループに属していないユーザーのみを表示したいと思います。すでにグループに参加しているユーザーは表示されないはずですが、私のビューには引き続きユーザーが表示されます。

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

また、groups / new.html.erbを表示している場合、これはurlhttp://localhost:3000/groups/new?id=2であり、idはtrip_idです。

私の質問:

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

ありがとう!

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

<% if !@friends.blank? %>
  <% @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
4

1 に答える 1

1

まず、モデルhas_many :tripsで2回呼び出しました。関係には2つUserの異なるタイプがあることを理解しています(1つは直接、もう1つはを介して)が、両方に同じ名前を付けることはできません。そうしないと、一方が他方を非表示にします。次のようにモデルを定義してみてください。UserTripGroupUser

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

friendのリストでgroupsオブジェクトTripを検索しているという問題もあります。その行を次のように変更してみてください。

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

または、新しいメソッドがなければ、次のようなものが機能するはずです。

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

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

于 2012-04-14T03:31:24.707 に答える