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
Ответы
Ответ 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>`