0

よろしくお願いします!Ruby on Rails(2.3.15、1.8.7)で構築されたサイトがあり、さまざまな場所への旅程を作成し、場所ごとにさまざまなアクティビティを実行できます。このサイトには、現在のユーザーが自分のアカウントに関連付けられている旅程のみを削除できるようにする方法があります。これを行うitineraries_controller.rbのコードは、次のようになります。

def destroy
  @itinerary = Itinerary.find(params[:id])
  if @itinerary.user_id == current_user.id

    @itinerary.destroy

    respond_to do |format|
      format.html { redirect_to('/home') }
      format.xml  { head :ok }
    end
  else
    redirect_to '/'
  end
end

このシステムはうまく機能します。でも、同じことをしたいです。activity_controllerで、現在のユーザーが自分のアカウントに関連付けられているアクティビティのみを削除できるようにします。

現在、これが私の4つのモデルです(不要なものは削除されています):

User.rb

class User < ActiveRecord::Base
  has_many :itineraries
end

Itinerary.rb

class Itinerary < ActiveRecord::Base
  has_many :locations
  belongs_to :user
end

Location.rb

class Location < ActiveRecord::Base
  belongs_to :itinerary
  has_many :activities
end

Activity.rb

class Activity < ActiveRecord::Base
  belongs_to :location
end

これが、activities_controller.rbから始めているところです。参考までに、私のcurrent_user.idはauthenticated_system.rbによって作成されているので、その部分について心配する必要はありません。

def destroy
  @activity = Activity.find(params[:id])
  if @itinerary.user_id == current_user.id

    @activity.destroy

    respond_to do |format|
      format.html { redirect_to("/") }
      format.xml  { head :ok }
    end
  else
    redirect_to '/'
  end
end

has_many:throughアプローチを使用してモデルを接続しようとしましたが、3つ以上のモデルで接続する方法がわからず、とにかくそれが正しいアプローチであるかどうかはわかりませんでした。あなたが提供できるどんな助けにももう一度感謝します!

4

2 に答える 2

2

あなたは簡単に行うことができます

if @activity.location.itinerary.user_id == current_user.id
于 2013-02-28T02:25:41.063 に答える
0

実際には、アクティビティにその場所を尋ねてから、その場所に旅程を尋ねるだけで、ユーザーに尋ねる必要はありません。デメテルの法則に少し違反していますが、機能します。

loc = @activity.location
itin = loc.itinerary
if itin.user_id = current_user.id
...

それはうまくいくはずです。

于 2013-02-28T02:29:50.873 に答える