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