【问题标题】:Rendering action of another controller if validation fails如果验证失败,则呈现另一个控制器的操作
【发布时间】:2018-03-23 13:20:21
【问题描述】:

几乎在我的应用程序的每一页上,我都有一个部分的表单,我可以在其中创建一个报价。为此,我有一个 offers_controller 和一个适当的 create 操作:

class OffersController < ApplicationController

  def create
    offer = Offer.new(offer_params)
    if offer.save
      redirect_to confirmation_offer_path
    else
      redirect_back(fallback_location: root_path, alert: 'Something went wrong.')
    end
  end

  private

  def offer_params
    params.permit(:company, :first_name, :last_name, :email, :phone, :subject, :message)
  end

end

如果验证失败,我需要显示错误消息。由于此表单位于每个页面上,我不知道如何呈现适当的操作。如果我只有一个页面包含此表单,控制器将如下所示:

class OffersController < ApplicationController

  def new
    @offer = Offer.new
  end

  def create
    @offer = Offer.new(offer_params)
    if @offer.save
      redirect_to confirmation_offer_path
    else
      render :new
    end
  end

  def offer_params
    params.require(:offer).permit(:company, :first_name, :last_name, :email, :phone, :subject, :message)
  end

end

那么,我怎样才能呈现一个动作来显示错误消息呢?先谢谢了。

【问题讨论】:

标签: ruby-on-rails validation


【解决方案1】:

您可以使用闪信:

http://api.rubyonrails.org/classes/ActionDispatch/Flash.html

然后,在你的应用布局文件中,你可以处理这个,例如:

<% flash.each do |key, value| %>
  <div class="alert alert-<%= key %> alert-dismissable fade in"><%= value %>
    <a href="#" class="close" data-dismiss="alert" aria-label="close">&times;</a>
  </div>
<% end %>

【讨论】:

  • 但我需要在验证失败后将数据保留在表单中。这就是为什么我需要渲染一个动作。
  • 如果您设置 Flash 消息,然后进行渲染,则需要使用 flash.now[:error] = "Something was wrong" 代替。 flash[:x] 在重定向(下一个请求)之后设置,而 flash.now 在此操作中设置,例如在使用渲染时。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-06
  • 1970-01-01
相关资源
最近更新 更多