Проверьте, существует ли модель, даже если ее нет - PullRequest
0 голосов
/ 22 февраля 2012

Я застрял на чем-то и понятия не имею, что делать. В моем контроллере бронирования у меня есть:

if Invitation.exists?

, который возвращает true, когда '/ events / 1 / invitations / 2 / reservations', как и ожидалось, вызывается, но возвращает:

'Couldn't find Invitation without an ID' 

когда вызывается '/ events / 1 / reservations', также ожидается. Хотя мне нужен способ проверить, существует ли он при вызове 2-го URL-адреса, и чтобы обойти инициацию, если @ приглашение.

Я очень новичок в рельсах, поэтому любой совет здесь будет приветствоваться.

Спасибо

--- EDIT ---

Думаю, я дал слишком мало информации.

По сути, я хочу использовать два URL:

1-й - это example.com/events/1/invitations/2/reservations - чтобы индекс резервирований отображал все бронирования, принадлежащие данному приглашению, в данном случае «2».

2nd - example.com/events/1/reservations - для отображения всех резервирований, относящихся к событию.

Итак, в действии index контроллера резервирования у меня есть:

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

Таким образом, в основном, если используется 2-й URL, я не могу использовать «Приглашение» в действии контроллера, поскольку оно выдает такую ​​ошибку: «Не удалось найти приглашение без идентификатора», поэтому мне нужен способ сообщить контроллеру, если заявление о том, что если идентификатор приглашения отсутствует (в URL?), не инициируйте @ приглашение.

Надеюсь, что понятнее, спасибо за помощь:)

Ответы [ 3 ]

1 голос
/ 22 февраля 2012

Ваш пост не совсем понятен, но вы этого хотите?

@invitation = params[:invitation] if params[:invitation]
1 голос
/ 22 февраля 2012

Вы используете здесь константу модели вместо фактического экземпляра модели, чего вы, вероятно, ожидаете. Вы хотите что-то еще как:

@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
0 голосов
/ 22 февраля 2012

Метод find вызывает исключение при отсутствии данных. Вы должны использовать метод find_by_*, если вы не хотите этого поведения, т.е.

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

Другие проблемы с вашим кодом:

  • Вызов Invitation.exists? просто проверяет, есть ли строки в таблице invitations. Я предполагаю, что это не то, что вы хотите. Вы должны предоставить идентификатор / или условия в качестве входных данных для проверки существования конкретного объекта. Прочитайте существует? документацию для более подробной информации.

  • Я бы изменил ваш код следующим образом:

Предполагая, что это ваша модель данных:

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 %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...