我有下面的模型结构。我需要添加验证,以便只有正确的餐厅用户和餐馆活动才能编辑/删除它们。
class User < ActiveRecord::Base
has_many :restaurants, dependent: :destroy
end
class Restaurant < ActiveRecord::Base
belongs_to :user
validates :user_id, presence: true
has_many :campaigns, dependent: :destroy
end
class Campaign < ActiveRecord::Base
belongs_to :restaurant
end
我记得有一个流程可以启用中央模型的“步进”,例如餐馆模型,这样就可以直接从用户模型中引用广告系列模型,例如:
@user.campaigns.find_by(params[:id])
如何启用此限额。
加成
我要做的是启用此方法仅允许拥有广告系列的用户编辑/删除/查看:
def correct_user
@user = User.find_by(params[:id])
@campaign = @user.campaigns.find_by(params[:id])
redirect_to root_url if @campaign.nil?
end
然后在控制器中我有:
before_action :correct_user, only: [:index, :edit, :update, :show, :destroy]
但是这种方法虽然没有错误,但不会阻止任何其他用户看到其他用户的广告系列。因此,使用@campaign = @user.campaigns.find_by(params[:id])
的路由无法正确。
答案 0 :(得分:0)
如果你有像
这样的嵌套路线resources :restaurants do
resources :campaigns
end
然后URL将包含restaurant_id,例如:
restaurants/:restaurant_id/campaigns/:id/edit
然后你可以在控制器中执行此操作
@restaurant = current_user.restaurants.find(params[:restaurant_id])
@campaign = @restaurant.campaigns.find(params[:id])