Подтвердить что ты не робот

Rails 3: Как отображать сообщения об ошибках во встроенной форме?

Я новичок в рельсах и пытаюсь настроить свою первую встроенную форму. Сама форма работает, но я не могу определить, как отправлять сообщения об ошибках проверки в представление. Я предположил, что f.object.errors предоставит доступ, но, хотя говорят, что метод существует, f.object.errors.count всегда возвращает 0 и f.object.errors.any? возвращает false. Помимо того, что не отображаются фактические сообщения об ошибках, форма работает как ожидалось, то есть не удается вставить недопустимые данные и вернуться к форме, которая не прошла проверку. Модель, контроллер и вид, перечисленные ниже - любая помощь, которую очень ценят.

...
<!-- Form embedded in boards/show.html.erb -->
<%= form_for([@board, @board.boardthreads.build]) do |f| %> 
    <div class="field">  
        <%= f.label :title %><br />  
        <%= f.text_field :title %>  
    </div>  
    <div class="field">    
        <div class="actions">  <%= f.submit %>  </div> 
    </div>
<% end %>
...



class Boardthread < ActiveRecord::Base
  belongs_to :user
  belongs_to :board

  validates :user, :presence => true
  validates :board, :presence => true
  validates :title, :presence => true
end


class BoardthreadsController < ApplicationController
    def create

        @board = Board.find(params[:board_id])
        @boardthread = @board.boardthreads.new(params[:boardthread])  
        @boardthread.user = current_user
        @boardthread.save
        redirect_to board_path(@board) 

    end
end
4b9b3361

Ответ 1

Это потому, что, когда вы потерпели неудачу, вы снова создаете объект в своей встроенной форме. Вам нужно использовать объект с ошибкой в ​​вашей форме.

В вашем новом действии вам нужно построить свой объект и использовать его на вашей встроенной форме. И во время создания вы используете его, потому что он уже определяет

<%= form_for([@board, @boardthread]) do |f| %>
    <% @boardthread.errors.full_messages.each do |msg| %>
      <p><%= msg %></p>
    <% end %>
    <div class="field">  
        <%= f.label :title %><br />  
        <%= f.text_field :title %>  
    </div>  
    <div class="field">    
        <div class="actions">  <%= f.submit %>  </div> 
    </div>
<% end %>

Ответ 2

В дополнение к ответу shingara: вам также может потребоваться добавить код для отображения ошибок в вашей форме, что-то вроде

<ul>
  <%-  @boardthread.errors.full_messages.each do |msg| %>
    <li><%= msg %></li>
  <%- end %>
</ul>`