これはばかげた例ですが、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
できます。ウォーレンのショービューを見ながら、ウサギを追加および破壊できます。問題は、フラッシュメッセージ ( :success
、:notice
) および/またはrabbit.errors
がビューに表示されないことです。今、私は自分の warren.rb モデルでは使用していません。accepts_nested_attributes_for
しかし、これはほとんど機能しています。Rails を学習していて、何が起こっているのか、メッセージがスムーズに流れるようにするにはどうすればよいのか疑問に思っています...
rabbits/_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