检查模型是否存在,即使它不存在

时间:2012-02-21 21:02:56

标签: ruby-on-rails ruby ruby-on-rails-3

我陷入困境,不知道该怎么做。在我的预订控制器中,我有:

if Invitation.exists?

当按照预期调用'/ events / 1 / invitations / 2 / reservations'时返回true,但返回:

'Couldn't find Invitation without an ID' 

当'/ events / 1 / reservations'被调用时,也是预期的。我需要一种方法,以便在调用第二个URL时检查它是否存在,并且如果@invitation则绕过启动。

我对rails非常陌生,所以欢迎任何建议。

由于

--- --- EDIT

我想我可能提供的信息太少了。

基本上我想要使用两个网址:

1st是example.com/events/1/invitations/2/reservations-为了让预订索引显示属于给定邀请的所有预订,在这种情况下为'2'。

第二个是example.com/events/1/reservations - 以显示属于某个事件的所有预订。

所以在预订控制器索引操作中我有:

@event = Event.find(params[:event_id])
@reservations = Reservation.all

if Invitation.exists?
  @invitation = Invitation.find(params[:invitation_id])
  @invite = true
else
end

在预订视图索引中我有:

<% if @invite == true%>
  <% @invitation.reservations.each do |reservation| %>
    ...
<% else %>
  <% @event.reservations.each do |reservation| %>
    ...
<% end %>

所以基本上如果使用了第二个URL我不能在控制器操作中使用'邀请',因为它会给出这个错误:“找不到没有ID的邀请”,所以我需要一种方法来告诉控制器是否声明如果没有邀请ID(在URL?中),请不要启动@invitation。

希望更清楚,谢谢你的帮助:)。

3 个答案:

答案 0 :(得分:1)

你在这里使用模型常量而不是模型的实际实例,这是你可能期望的。你想要更像的东西:

@invitation = Invitation.find(params[:id])

如果找到邀请,则继续继续。

- 编辑 -

我想我得到了你想要做的事情。试试这个:

def index
    @event = Event.find(params[:id])
    @invitation = Invitation.find(params[:invitation_id]) if params[:invitation_id]
    @reserations = Reservation.all
    ...
end

答案 1 :(得分:1)

您的帖子不完全清楚,但您想要这个吗?

@invitation = params[:invitation] if params[:invitation]

答案 2 :(得分:0)

find方法在没有数据时抛出异常。如果您不想要这种行为,则应使用find_by_*方法,即

@invitation = Invitation.find_by_id(params[:invitation_id])

您的代码存在其他问题:

  • Invitation.exists?调用只是检查invitations表中是否有任何行。我假设这不是你想要的。您必须提供id /或条件作为输入以检查特定对象是否存在。有关详细信息,请阅读exists?文档。

  • 我会按如下方式重构您的代码:

假设这是您的数据模型:

class Event
  has_many :reservations
  has_many :invitations
end

class Reservation
  belongs_to :event
  belongs_to :invitation
end

class Invitation
  belongs_to :event
  has_many :reservations            
end

更改您的控制器代码:

@event = Event.find(params[:event_id])
@reservations = if params[:invitation_id].present?
  (@invitation = @event.invitations.find([:invitation_id])).reservations
else
  @event.reservations
end

修改视图代码以访问@reservations列表:

<% @reservations.each do |reservation| %>
    ...
<% end %>