在Ruby on Rails应用程序中限制对“destroy”功能的访问

时间:2013-02-28 02:14:10

标签: ruby-on-rails ruby model-view-controller ruby-on-rails-2

提前感谢您的帮助!我有一个用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

这个系统效果很好。但是,我想为活动做同样的事情。在activities_controller中,我想确保当前用户只能删除与其帐户关联的活动。

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

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方法连接模型,但我不知道如何为三个以上的模型进行连接,而且我不确定这是否是正确的方法。再次感谢您提供的任何帮助!

2 个答案:

答案 0 :(得分:2)

你可以简单地做

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

答案 1 :(得分:0)

你真的只需要询问活动的位置,然后询问该地点的行程,而不是询问其用户。这有点违反了得墨忒耳法,但它会起作用。

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

这应该有效。