Вызов создать действие из другого контроллера - PullRequest
0 голосов
/ 08 марта 2019

Я хотел бы создать бронирование от bookings#new и rooms#show.Когда я пытаюсь создать его из bookings#new, он работает, но при попытке создать его из rooms#show он показывает мне ошибку:

1 ошибка запретила сохранение этого бронирования, номер должен существовать,

Вот код, который я использую:

BookingsController:

def create
  if @room          
    @room = Room.find(params[:room_id])
    @booking = @room.bookings.create(booking_params)
    if @booking.save
      redirect_to room_path(@room)
    else
      render :new
    end        
  else 
    @booking = Booking.new(booking_params)
    respond_to do |format|
      if @booking.save
        format.html { redirect_to @booking, notice: 'Booking was successfully created.' }
        format.json { render :show, status: :created, location: @booking }
      else
        format.html { render :new }
        format.json { render json: @booking.errors, status: :unprocessable_entity }
      end
    end
  end
end

views / rooms / show.html.erb

<h2>book this room:</h2>
<%= form_with(model: [ @room, @room.bookings.build ], local: true) do |form| %>
  <p>
    <%= form.label :traveller %>
    <%= form.text_field :traveller %>
  </p>

 <p>
    <%= form.label :startfrom %>
    <%= form.datetime_select :startfrom %>
  </p>

  <p>
    <%= form.label :endsat %>
    <%= form.datetime_select :endsat %>
  </p>

  <p>
    <%= form.label :bookingref %>
    <%= form.text_field :bookingref %>
  </p>

  <p>
    <%= form.submit %>
  </p>
<% end %>

1 Ответ

1 голос
/ 09 марта 2019

Ваша ошибка внутри if-else в контроллере.Вы проверяете @room до того, как определите его, поэтому оно всегда равно нулю.Это должно быть:

def create
  # use find_by here, otherwise you get RecordNotFound error
  @room = Room.find_by(id: params[:room_id])
    if @room
      # use build, because create saves the instance
      @booking = @room.bookings.build(booking_params)
      if @booking.save
        redirect_to room_path(@room)
      else
        # I suppose you don't want render bookings/new view here
        render 'books/show'
      end
    else 
      @booking = Booking.new(booking_params)
      respond_to do |format|
        # redirect and render logic goes here. BTW, do you really need json response format?
      end
    end
  end
end

Кроме того, определите в комнатах # show action

@booking = @room.bookings.build

и используйте экземпляр в форме для правильного отображения ошибок проверки

form_with(model: [@room, @booking], local: true) do |form| 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...