我设置了一些嵌套路由,如下所示:-
resources :events, only: :index
resources :organisations do
resources :events, except: [:index]
end
允许我有以下路线:-
/events
/organisations/1/events/1
以上两种方法都很好,但是,我可以更改URL中的事件id,它会给我一个不属于该组织的事件,但组织id将保持不变:-
/organisations/1/events/2
也就是说,这将向我展示第二次活动,但这次活动的组织现在是第一次组织。
在我的EventsController中,我只有通常生成的普通路由:-
class EventsController < ApplicationController
before_action :set_event, only: %i[show edit update destroy]
before_action :set_organisation, except: %i[index]
# GET /events/1
def show; end
# Use callbacks to share common setup or constraints between actions.
def set_event
@event = Event.find(params[:id])
end
def set_organisation
@organisation = Organisation.find(params[:organisation_id])
end
我的问题是:-Rails应该知道如何处理这个问题,我在这里设置错误了吗?还是我只需要通过在show
方法中检查当前事件属于当前组织来手动处理它(如果不是,则重定向到某个地方(?
您需要手动处理它。
在set_event中,Event.find(params[:id])
在没有任何操作检查的情况下直接查找记录。
处理它的一种方法是使用作用域。如果您传递了一个不属于组织的事件id,您将收到RecordNotFound。
def set_event
@event = @organisation.events.find(params[:id])
end
您还需要更改回调的顺序:set_organization应该在set_event之前调用。