【问题标题】:Rails: Losing flash/errors from embedded form after redirect_toRails:redirect_to 后从嵌入式表单中丢失闪存/错误
【发布时间】:2010-12-10 10:49:48
【问题描述】:

这是一个愚蠢的例子,但我试图了解事情是如何在 Rails 的幕后传递的。并且可能有更好的“Rails”方法来解决这个问题......如果是这样,请告诉我。我有:

Warren has_many Rabbits
Rabbit belongs_to Warren

我列出了现有的兔子,然后提供了一个用于添加新兔子的表单。

warrens/show.html.haml

%h1 This Warren

%h2 Rabbits
= render @warren.rabbits, :target => @warren

%h2 Add a rabbit:
= render "rabbits/form", :parent => @warren, :foreign_key => :warren_id

= link_to 'Edit', edit_warren_path(@warren)
\|
= link_to 'Back', warrens_path

它有效。我可以在查看 Warren 的展示视图时添加和销毁兔子。问题是 flash 消息(:success:notice)和/或rabbit.errors 没有显示在视图中/视图中。现在,我在我的 warren.rb 模型中使用 accepts_nested_attributes_for。但这是大部分的工作。学习 Rails 很想知道发生了什么以及如何让我的消息流畅地流动...

兔子/_form.html.haml

= form_for ([parent, parent.rabbits.build]) do |f| 
    = render "shared/error_messages", :target => parent

    .field
        = f.label :name
        = f.text_field :name
    .field
        = f.label :color
        = f.text_field :color
    .field
        = f.hidden_field foreign_key
    .actions
        = f.submit 'Save'

layouts/application.html.haml

    !!!
    %html
        %head
               ...
        %body
            .container
                - flash.each do |key, value|
                    %div{ :class => ['flash', key] }= value
                = yield

rabbits_controller.rb

class RabbitsController < ApplicationController

  def create
    @warren = Warren.find(params[:warren_id])
    @rabbit = @warren.rabbits.create(params[:rabbit])
    redirect_to @warren
  end

  def destroy
    @warren = Warren.find(params[:warren_id])
    @rabbit = @warren.rabbits.find(params[:id])
    @rabbit.destroy
    redirect_to @warren
  end

shared/_error_messages.html.haml

-if target.errors.any?
  #error_explanation
    %h2= "#{pluralize(target.errors.count, "error")} prohibited this record from being saved:"
    %ul
      - target.errors.full_messages.each do |msg|
        %li= msg

【问题讨论】:

  • 我看不到你在哪里设置快闪信息...应该在 rabbits_controller.rb 中。
  • 是的!现在明白了。谢谢!仍在为错误消息而苦苦挣扎。

标签: ruby-on-rails partial-views has-many partials


【解决方案1】:

似乎您没有在控制器中设置闪存消息。请尝试以下操作:

def create
  @warren = Warren.find(params[:warren_id])
  @rabbit = @warren.rabbits.create(params[:rabbit])
  redirect_to @warren, :flash => { :info => "Rabbit was just born." }
end

def destroy
  @warren = Warren.find(params[:warren_id])
  @rabbit = @warren.rabbits.find(params[:id])
  @rabbit.destroy
  redirect_to @warren, :flash => { :info => "Rabbit was brutally murdered!" }
end

另外,我相信你可以使用:success / notice

redirect_to @warren, :success => "Rabbit was brutally murdered!"

希望这会有所帮助!

更新

对于您的错误消息,您需要target.error_messages 之类的内容。您可以找到有关自定义输出here 的更多详细信息。

【讨论】:

  • 谢谢!确实如此!很明显,在学习和进行了这么多事情后,我忘记指定 :flash 了。谢谢!现在知道如何捕获和显示错误消息 (.errors)? 使用临时 @vendor.items.build 对象来构建表单的问题很明显......但是当 rabbits_controller 的 create 方法验证失败时我不知道如何处理错误?!?
  • 我正在使用 Rails 3 并获得 error_messages 的“未定义方法”和 error_messages_for 的弃用警告!?!不确定为什么它们仍在 Rails 3 文档中?说你需要安装一个插件才能让他们回来。除非我使用不正确,否则我想知道“Rails 3 方式”(哈!)是什么?
  • 嗯...也许尝试用render "shared/error_messages", :locals =&gt; { :target =&gt; parent }替换render "shared/error_messages", :target =&gt; parent
  • 不起作用。我认为正在发生的事情是parent(从_form.html.haml 的角度来看)是@warren。但是,这个partial 接受参数并且应该 报告错误的是Rabbit 的一个实例。问题,看到的方式是我正在“构建” Rabbit 实例以使用parent.rabbits.build 呈现表单,并且出于我不知道这些错误的原因当rabbits_controller.rb 出现验证错误并强加redirect_to 时,不会被传回。 也许我应该以:target 的身份传递一只兔子? 但是如何?
  • 在每个部分中 - 尝试添加一些调试以查看到底发生了什么。在 ERB 中,它将是 &lt;%= debug @object %&gt;
猜你喜欢
  • 1970-01-01
  • 2012-06-29
  • 1970-01-01
  • 2021-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-19
  • 2015-08-17
相关资源
最近更新 更多