如何在rails中实现多级模型引用

时间:2014-09-13 14:35:26

标签: ruby-on-rails associations rails-activerecord

我有下面的模型结构。我需要添加验证,以便只有正确的餐厅用户和餐馆活动才能编辑/删除它们。

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])的路由无法正确。

1 个答案:

答案 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])