【问题标题】:How to display errors in form_with Rails如何在 form_with Rails 中显示错误
【发布时间】:2020-08-12 22:58:13
【问题描述】:

我正在尝试在 form_with 中显示错误。这是我的代码:

booking/new.html.erb

(...)
<%= form_with(model: [@space, @booking], local: true) do |f| %>
  <%= label_tag :check_in, "Check in" %>
  <%= f.date_field :check_in, class: "form-control" %>
  <%= label_tag :check_out, "Check out" %>
  <%= f.date_field :check_out, class: "form-control" %>

  <%= submit_tag "Reserve", class: "btn btn-primary %>
<% end %>
(...)

这是控制器:

bookings_controller.rb

(...)

  def new
    @space = Space.find(params[:space_id])
    @booking = Booking.new
    @query1 = session[:query1]
    @query2 = session[:query2]
  end

  def create
    @space = Space.find(params[:space_id])
    booking  = Booking.create(booking_params)
    unless booking.valid?
    #show your errors
      redirect_to new_space_booking_path(@space)
    else

      session = Stripe::Checkout::Session.create(
        payment_method_types: ['card'],
        line_items: [{
          (...)
        }],
        success_url: success_booking_payments_url(booking),
        cancel_url: new_booking_payment_url(booking)
        )

      booking.update_attribute(:checkout_session_id, session.id)
      redirect_to new_booking_payment_path(booking)
    end
  end


  private

  def booking_params

    params.require(:booking).permit(:check_in, :check_out).merge(state: 'pending', amount: @space.price, user: current_user, space: @space)
  end
end

一切运行良好,但我想在表单中显示错误(字段和基数)。我尝试了一些解决方案,例如 Rails form_with errors (remote: true),但它们似乎不适用于我的情况。

【问题讨论】:

  • 如何在控制器中渲染新视图?
  • 你的创建方法在哪里?这是唯一会产生错误的。
  • 我正在尝试:if booking redirect_to new_booking_payment_path(booking) else render "spaces/show" end 但它不起作用
  • show方法永远不会出错。
  • 是否有任何解决方法来呈现我放置在“空间/显示”中的表单?

标签: ruby-on-rails ruby validation activerecord


【解决方案1】:

create! 会引发错误,create 不会。

可能想要这样的东西。

class BookingsController < ApplicationController

  def new
    @space = Space.find(params[:space_id])
    @booking = Booking.new
    @query1 = session[:query1]
    @query2 = session[:query2]
  end

  def create
    @space = Space.find(params[:space_id])
    @booking  = Booking.new(booking_params)

    if @booking.save
       session = Stripe::Checkout::Session.create(
         payment_method_types: ['card'],
         line_items: [{
           name: @space.address,
           images: [@space.photo],
           amount: @space.price_cents * (1 + (@booking.check_out - @booking.check_in).to_i),
          currency: 'gbp',
          quantity: 1
        }],
        success_url: success_booking_payments_url(@booking),
        cancel_url: new_booking_payment_url(@booking)
      )
      @booking.update_attribute(:checkout_session_id, session.id)
      redirect_to new_booking_payment_path(@booking)
    else
      render :new
    end
  end

  private

  def booking_params

    params.require(:booking).permit(:check_in, :check_out).merge(state: 'pending', amount: @space.price, user: current_user, space: @space)
  end
end

【讨论】:

  • 现在 redirect_to new_space_booking_path(@space) 如果验证失败但仍无法在 form_with 中显示错误。理想情况下,我想在表单中显示字段和基本错误。
  • 错误在预订中,而不是在空间中。无法显示不存在的内容。
  • booking 嵌套在空间 new_space_booking_path(@space) 对应于 booking#new
  • 您创建的预订是否与预订参数中的@space 相关联?否则它们与您显示的代码无关。
  • 我在上面添加了 booking_params。我有 :space_id 其中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多