Руководство по началу работы с Rails 3.0.3 не отображает div_with_errors для поля Tag (первое сообщение) - PullRequest
3 голосов
/ 12 декабря 2010

Я прочитал и скопировал / скопировал весь пример блога Ruby on Rails 3 Getting Started.У меня работает работающее приложение для блога.Я добавил код проверки в модель Post следующим образом:

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 для поля Tag.

Полученный 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">?Это как-то связано с тем, что форма тега находится в частичном?Спасибо за чтение моего первого сообщения.

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 %>

Командный терминалвыводится при отправке пустой формы:

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 ]

0 голосов
/ 16 декабря 2010

Я не совсем уверен, как работает магия field_with_errors, но, похоже, для проверки поля не требуется метка или ввод.Так что, если вы добавите post_form.label :tags, это вызовет его.Но оно не отображается для имени text_field (или метки) в тегах, поскольку поле имени тега не проходит проверку.Если вы хотите, вы можете добавить field_with_errors div самостоятельно после проверки @post.errors[:tags].empty?.

0 голосов
/ 17 декабря 2010

Я думаю, что вижу пару вещей, но я не уверен ни в одном из них. Во-первых, я не думаю, что вы можете использовать теги validates: напрямую, если #tags является ассоциацией, а не атрибутом. Это должно быть validates_associated: теги (и затем validates_presence_of: name в модели тегов).

Во-вторых, разве опция reject_if для accept_nested_attributes_ не будет запущена, если вы отправите пустую форму? Если это произойдет, ваш объект Tag будет уничтожен до визуализации формы.

0 голосов
/ 12 декабря 2010

Вы добавили attr_accessible в свой Post класс:

class Post < ActiveRecord::Base
    ....
    attr_accessible :tag_attributes 
    # or it could be the plural version :tags_attributes
    ....
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...