【问题标题】:Check if model exists even if it's not present检查模型是否存在,即使它不存在
【发布时间】:2012-02-21 21:02:55
【问题描述】:

我被一些事情困住了,不知道该怎么办。在我的预订控制器中,我有:

if Invitation.exists?

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

'Couldn't find Invitation without an ID' 

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

我对 Rails 很陌生,所以欢迎在这里提出任何建议。

谢谢

---编辑---

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

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

第一个是 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。

希望更清楚,感谢您的帮助:)

【问题讨论】:

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


    【解决方案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
    

    【讨论】:

    • 感谢您的回复,但这对我没有帮助,因为它仍然引用“邀请”,当我通过 URL 2 访问时会导致问题 - 请参阅编辑。
    • 感谢您对我的编辑的回复。有人闻到土拨鼠的味道吗?
    【解决方案2】:

    你的帖子不是很清楚,但是你想要这个吗?

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

    【讨论】:

      【解决方案3】:

      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 %>
      

      【讨论】:

      • 谢谢!这正是我所需要的,特别是:if params[:invitation_id].present?并感谢编码提示。
      猜你喜欢
      • 2016-11-30
      • 2017-12-21
      • 1970-01-01
      • 1970-01-01
      • 2019-05-05
      • 2021-01-05
      • 1970-01-01
      • 2014-07-17
      • 2014-02-26
      相关资源
      最近更新 更多