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 中,我要确保当前用户只能删除与其帐户关联的活动。

目前,这是我的四个模型(去掉了不必要的东西):

用户.rb

class User < ActiveRecord::Base
  has_many :itineraries
end

行程.rb

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

位置.rb

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

活动.rb

class Activity < ActiveRecord::Base
  belongs_to :location
end

这是我从activity_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 方法连接模型,但我不知道如何为超过三个模型执行此操作,而且我不确定这是正确的方法。再次感谢您提供的任何帮助!

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 回答