【问题标题】:After submit form I want to stay in the same page and display :notice messages提交表单后,我想留在同一页面并显示:通知消息
【发布时间】:2012-11-19 20:13:48
【问题描述】:

我的所有代码都运行良好,我想在用户提交带有您的订单的表单后呈现相同的页面:new。问题在于提交后我想在页面中显示 Pedido enviado com sucesso. 的 :notice 消息,但它不起作用。我的验证错误消息显示得很好,但我不知道为什么我的成功消息没有显示。

有什么建议吗?

(对不起我的代码缩进)

我的pedidos_controller 挂了:

class PedidosController < ApplicationController

  def new
    @pedido = Pedido.new
    1.times do
      pessoa = @pedido.build_pessoa
      produto = @pedido.produtos.build
  end

  respond_to do |format|
    format.html # new.html.erb
    format.json { render json: @pedido }
  end
end

def create
  @pedido = Pedido.new(params[:pedido])
  respond_to do |format|
    if @pedido.save
      PedidosMailer.delay.registro_do_pedido(@pedido)
      PedidosMailer.delay.email_para_cotar_produtos(@pedido)
      format.html { redirect_to action: "new", notice: 'Pedido enviado com sucesso.' }
      format.json { render json: @pedido, status: :created, location: @pedido }
    else
      format.html { render action: "new" }
      format.json { render json: @pedido.errors, status: :unprocessable_entity }
    end
  end
end
end

我的new.html.erb 视图:

<p id="notice"><%= notice %></p>
<%= render 'form' %>

我的_form.html.erb 观点:

<%= form_for(@pedido, :html => { :class => "form-contato"}) do |f| %>
<% if @pedido.errors.any? %>
  <div id="error_explanation">
    <h2>Ocorreram <%= pluralize(@pedido.errors.count, "erro") %></h2>

  <ul>
  <% @pedido.errors.full_messages.each do |msg| %>
    <li><%= msg %></li>
  <% end %>
  </ul>
</div>
<% end %>

<div class="row">
  <div class="span4">
    <h1>Dados pessoais</h1>
    <%= f.fields_for :pessoa do |builder| %>
      <%= render 'pessoa_fields', f: builder %>
    <% end %>
  </div>

<div class="span8">
  <h1>Ítens</h1>

  <%= f.fields_for :produtos do |builder| %>
    <%= render 'produto_fields', f: builder %>
  <% end %>
</div>
<div class="span10">
  <%= link_to_add_fields "Adicionar mais produtos", f, :produtos %>
</div>
  <%= button_tag "Enviar", class: "btn btn-red span10", name: "commit" %>
</div>
<% end %>

我的_pessoa_fields.html.erb 观点:

<fieldset>
<%= f.text_field :nome, class: "span4", placeholder: "Nome" %>
<br />
<%= f.text_field :telefone, class: "span4", placeholder: "Telefone" %>
<br />
<%= f.text_field :email, class: "span4", placeholder: "Email" %>
</fieldset>

我的_produto_fields.html.erb 视图:

<% @lista_de_produtos = ["Qualibom standard", "Qualibom premium", "Bomdemais standard", "Bomdemais premium"] %>
<fieldset class="campos-produtos span10">
<div class="span3">
    <%= f.select :nome, options_for_select(@lista_de_produtos, :selected => f.object.nome), :prompt => 'Selecione um produto' %>
</div>
<div class="span3">
    <%= f.text_field :quantidade, class: "span3", placeholder: "Quantidade" %>
</div>
</fieldset>

【问题讨论】:

  • 你为什么有1.times do....?
  • 在我向用户展示2或3个产品字段之前有点错误。感谢记住。

标签: ruby-on-rails ruby ruby-on-rails-3.2


【解决方案1】:

在你看来,你需要使用flash[:notice],而不是notice

<% if flash[:notice] %>
  <p id="notice"><%= flash[:notice] %></p>
<% end %>

当您通过redirect_tonotice: 参数传递消息时,它会被放入flash 数组中,这是一个特殊的pseduo-session,对于单个请求会持续存在:

来自ActionController::Redirecting documentation

也可以在重定向过程中指定一个 flash 消息。对于常用的 flash 名称 alert 和 notice 以及一个通用的 flash bucket,有两个特殊的访问器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-29
    • 2016-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多