1

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

Warren has_many Rabbits
Rabbit belongs_to Warren

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

沃伦斯/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没有显示在视图上/视图中。现在,我没有accepts_nested_attributes_for在我的 warren.rb 模型中使用。但这主要是有效的。学习 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'

布局/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

共享/_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
4

1 回答 1

2

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

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. 您可以在此处找到有关自定义输出的更多详细信息。

于 2010-12-09T21:45:11.690 回答