Rails 3.0.3 Getting Started Guide code does not display field_with_errors div field for Tag field (first post)

I read and copied / pasted the entire sample Ruby on Rails 3 Getting Started sample application. I have a working blogging application. I added the verification code to the Post model as follows:

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

When I try to submit an empty form to verify the verification code, I get the expected errors, but it does not display the div <div class="field_with_errors">for the Tag field.

The resulting 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>

What could be the reason for the absence <div class="field_with_errors">? Does this have anything to do with the partial tag form? Thanks for reading my first post.

Posts / _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 %>

/ tags _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 %>

The output of the command when sending an empty form:

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)
+3
3

attr_accessible Post:

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

, field_with_errors, , , , . , post_form.label :tags, . text_field ( ) , . , div field_with_errors @post.errors[:tags].empty?.

0

, , . -, , : , #tags - , . validates_associated: ( validates_presence_of: ).

Secondly, this is not an option: reject_if accept_nested_attributes_ to run if you submit an empty form? If this happens, your Tag object will be cleared before the form is rendered.

0
source

Source: https://habr.com/ru/post/1779792/


All Articles