2010-12-11 1 views
3

Ruby on Rails 3入門ガイドのブログサンプルアプリケーション全体を読み込んでコピー/ペーストしました。私は働いているブログアプリケーションを稼働させている。次のように私は、Postモデルにいくつかの検証コードを追加しました:Rails 3.0.3 Getting Started Guideコードにfield_with_errorsタグが表示されないタグフィールド(最初の投稿)

class Post < ActiveRecord::Base 
    validates :name, :length => { :maximum => 64 } 

    validates :title, :presence => true, 
      :length => { :minimum => 5 } 

    validates :content, :presence => true, 
      :length => { :minimum => 5 } 

    validates :tags, :presence => true, 
      :length => { :minimum => 1 } 

    has_many :comments, :dependent => :destroy 
    has_many :tags 

    accepts_nested_attributes_for :tags, :allow_destroy => :true, 
      :reject_if => proc { |attrs| attrs.all? { |k, v| v.blank? } } 
end 

私は私が期待したエラーを取得し、検証コードをテストするために、空のフォームを送信しようとするが、それはタグの<div class="field_with_errors">のdivを表示しません。フィールド。

結果のHTML:

<!DOCTYPE html> 
<html> 
<head> 
    <title>Rails Blog</title> 
    <link href="/stylesheets/scaffold.css?1292045851" media="screen" rel="stylesheet" type="text/css" /> 
    <script src="/javascripts/prototype.js?1292044228" type="text/javascript"></script> 
    <script src="/javascripts/effects.js?1292044228" type="text/javascript"></script> 
    <script src="/javascripts/dragdrop.js?1292044228" type="text/javascript"></script> 
    <script src="/javascripts/controls.js?1292044228" type="text/javascript"></script> 

    <script src="/javascripts/rails.js?1292044229" type="text/javascript"></script> 
    <script src="/javascripts/application.js?1292044228" type="text/javascript"></script> 
    <meta name="csrf-param" content="authenticity_token"/> 
    <meta name="csrf-token" content="FYDsbSpjAry7CQrVbdgdozsOJ66w4f4b8nVQ+towSYg="/> 
</head> 
<body> 

<h1>New post</h1> 

<form accept-charset="UTF-8" action="/posts" class="new_post" id="new_post" method="post"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="&#x2713;" /><input name="authenticity_token" type="hidden" value="FYDsbSpjAry7CQrVbdgdozsOJ66w4f4b8nVQ+towSYg=" /></div> 
    <div id="errorExplanation"> 
    <h2>6 errors prohibited this post from being saved:</h2> 

    <ul> 
     <li>Title can't be blank</li> 
     <li>Title is too short (minimum is 5 characters)</li> 
     <li>Content can't be blank</li> 
     <li>Content is too short (minimum is 5 characters)</li> 
     <li>Tags can't be blank</li> 

     <li>Tags is too short (minimum is 1 characters)</li> 
    </ul> 
    </div> 

    <div class="field"> 
    <label for="post_name">Name</label><br /> 
    <input id="post_name" name="post[name]" size="30" type="text" value="" /> 
    </div> 
    <div class="field"> 

    <div class="field_with_errors"><label for="post_title">Title</label></div><br /> 
    <div class="field_with_errors"><input id="post_title" name="post[title]" size="30" type="text" value="" /></div> 
    </div> 
    <div class="field"> 
    <div class="field_with_errors"><label for="post_content">Content</label></div><br /> 
    <div class="field_with_errors"><textarea cols="40" id="post_content" name="post[content]" rows="20"></textarea></div> 
    </div> 

    <h2>Tags</h2> 

    <div class="field"> 
    <label for="post_tags_attributes_0_name">Tag:</label> 
    <input id="post_tags_attributes_0_name" name="post[tags_attributes][0][name]" size="30" type="text" /> 
    </div> 

    <div class="actions"> 
    <input id="post_submit" name="commit" type="submit" value="Create Post" /> 

    </div> 
</form> 

<a href="/posts">Back</a> 


</body> 
</html> 

<div class="field_with_errors">不在を引き起こしている可能性がありますか?タグフォームが部分的なものと関係がありますか?私の最初の投稿を読んでくれてありがとう。

記事/ _form.html.erb:

<% @post.tags.build %> 
<%= form_for(@post) do |post_form| %> 
    <% if @post.errors.any? %> 
    <div id="errorExplanation"> 
    <h2><%= pluralize(@post.errors.count, "error") %> prohibited this post from being saved:</h2> 
    <ul> 
    <% @post.errors.full_messages.each do |msg| %> 
     <li><%= msg %></li> 
    <% end %> 
    </ul> 
    </div> 
    <% end %> 

    <div class="field"> 
    <%= post_form.label :name %><br /> 
    <%= post_form.text_field :name %> 
    </div> 
    <div class="field"> 
    <%= post_form.label :title %><br /> 
    <%= post_form.text_field :title %> 
    </div> 
    <div class="field"> 
    <%= post_form.label :content %><br /> 
    <%= post_form.text_area :content %> 
    </div> 
    <h2>Tags</h2> 
    <%= render :partial => 'tags/form', 
      :locals => {:form => post_form} %> 
    <div class="actions"> 
    <%= post_form.submit %> 
    </div> 
<% end %> 

タグ/ _form.html.erb:

<%= form.fields_for :tags do |tag_form| %> 
    <div class="field"> 
    <%= tag_form.label :name, 'Tag:' %> 
    <%= tag_form.text_field :name %> 
    </div> 
    <% unless tag_form.object.nil? || tag_form.object.new_record? %> 
    <div class="field"> 
     <%= tag_form.label :_destroy, 'Remove:' %> 
     <%= tag_form.check_box :_destroy %> 
    </div> 
    <% end %> 
<% end %> 

空白のフォームが送信されるコマンド端子出力:

Started POST "/posts" for 192.168.11.28 at 2010-12-11 23:23:03 +0000 
    Processing by PostsController#create as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"T2o6Tn8cfeJyVVcFMU91Zuk42BBs06uqyMIgfmy41SM=", "post"=>{"name"=>"", "title"=>"", "content"=>"", "tags_attributes"=>{"0"=>{"name"=>""}}}, "commit"=>"Create Post"} 
Rendered tags/_form.html.erb (45.5ms) 
Rendered posts/_form.html.erb (320.0ms) 
Rendered posts/new.html.erb within layouts/application (351.2ms) 
Completed 200 OK in 748ms (Views: 379.2ms | ActiveRecord: 0.0ms) 
+0

フォームの部分的なルビーコードを投稿してください。 –

+0

空白のタグの検証エラーは実際に出ますか、それとも保存されませんか? –

+0

ブランクフォームを送信しようとすると、「タグは空白にできません」と表示され、 'タグは短すぎます(最小は1文字です)'とコマンドライン出力が上記の投稿に追加されます。 – BasicObject

答えて

0

Postクラスにattr_accessibleを追加しましたか:

class Post < ActiveRecord::Base 
    .... 
    attr_accessible :tag_attributes 
    # or it could be the plural version :tags_attributes 
    .... 
end 
+0

ありがとうございます。私は 'attr_accessible:name、:title、:content、:tags_attributes'と' attr_accessible:tags_attributes'を試しました。最初のものは私が投稿を作成することを可能にし、他のものは作成しません。 'tag_attributes'や' post_tags_attributes'を使うと大量割り当て警告が出ます。残念ながら、 'attr_accessible:name、:title、:content、:tags_attributes'はfield_with_errors divクラスの問題を解決しません。 – BasicObject

0

field_with_errorsの魔法の仕組みはよく分かりませんが、検証に失敗したフィールドにはラベルや入力が必要なようです。したがって、それをトリガーするpost_form.label :tagsを追加した場合。タグ名フィールドが検証に失敗していないため、タグにtext_field(またはlabel)という名前は表示されません。あなたがfield_with_errors divを追加することができたら、@post.errors[:tags].empty?をチェックしてください。

0

私はいくつかのことを見ていると思うが、どちらかについては肯定的ではない。まず、#tagsがアトリビュートではなくアソシエーションである場合、タグを直接使用することはできません。これはvalidates_associated:tags(タグモデルのvalidates_presence_of:name)である必要があります。

第2に、空白のフォームを送信した場合にaccept_nested_attributes_forのreject_ifオプションが起動されないことですか?これが起こると、フォームがレンダリングされる前にTagオブジェクトが消去されます。

関連する問題