2015-05-11 3 views
0

Я пытаюсь получить валидацию, работающую для моего назначения формы комментариев. По какой-то причине все, что я получаю, это моя флеш-ошибка, возвращаемая ко мне. То, как он реагирует (абсолютно никакого вывода), я подозреваю, что я не указал вещи должным образом.Проверка правильности формы Rails не работает, нет вывода

Комментарии должны быть созданы только сейчас, поэтому сгенерируйте comment_controller с соответствующим действием;

Заполните действие для создания. Он должен создать новый комментарий, связанный с сообщением и создателем current_user;

flash[:error] = "Error saving the comment. Please try again." 

_form.html.erb

<%= form_for [topic, post, comment] do |f| %> 
    <% if comment.errors.any? %> 
    <div class="alert alert-danger"> 
     <h4>There are <%= pluralize(comment.errors.count, "error") %>.</h4> 
     <ul> 
     <% comment.errors.full_messages.each do |msg| %> 
      <li><%= msg %></li> 
     <% end %> 
     </ul> 
    </div> 
    <% end %> 

    <div class="form-inline"> 
    <%= form_group_tag(comment.errors[:body]) do %> 
     <%= f.label :body %> 
     <%= f.text_field :body, class: 'form-control'%> 
    <% end %> 

    <div class="form-group"> 
     <%= f.submit "Comment", class: 'btn btn-default' %> 
    </div> 
    </div> 
    <% end %> 

в form_group_tag я указал: тело, чтобы соответствовать мой ярлык/текстовое поле.

вот мой комментарий модель с: телом и: пользователь уточняются

class Comment < ActiveRecord::Base 
    belongs_to :post 
    belongs_to :user 

    # minimum 5 characters and must be signed in 
    validates :body, length: { minimum: 5 }, presence: true 
    validates :user, presence: true 
end 

comments_controller.rb

class CommentsController < ApplicationController 
    def create 
    # find topic by id 
    @topic = Topic.find(params[:topic_id]) 
    # find post id through topic 
    @post = @topic.posts.find(params[:post_id]) 
    # comments on post 
    @comments = @post.comments 

    @comment = current_user.comments.build(params.require(:comment).permit(:body, :post_id)) 
    @comment.post = @post 

    if @comment.save 
     flash[:notice] = "Your comment was created." 
     redirect_to [@topic, @post] 
    else 
     flash[:error] = "Error saving the comment. Please try again." 
     redirect_to [@topic, @post] 
    end 
    end 
end 

Если я нажму кнопку отправки появляется ошибка вспышки только, ничто не связано с подтверждением возвращается мне.

+0

Что у вас в Def new? Попробуйте @comment = current_user.comments.new вместо current_user.comments.build – bntzio

+0

Он делает то же самое. Я обновлю вопрос, у меня не должно быть метода «def new». –

+0

Как упоминают @bntzio и @mgrim, это корень вашей проблемы. Обычная парадигма заключается в том, что действие 'new' отображает эту форму, которая затем отправляется на ваш' create' действие. Итак, если вы хотите повторно отобразить форму с дополнительной информацией (ошибкой), вы должны использовать 'render 'new''. Какое действие контроллера представляет изначально '_form.html.erb'? –

ответ

2

В comments_controller.rb вы перенаправляете на ошибку, которая перезагружает страницу и сбрасывает запись. Вы должны отобразить вид формы.

Попробуйте заменить строку

redirect_to [@topic, @post] 

с

render :new 

@comment.save, если не удается. (Я предполагаю, что вы после обычного именование.)

EDIT:

Вы могли бы хотеть, чтобы сделать вид, что включает в себя «комментарии/_form» частичный. Я предположил, что это «комментарии/новые», но, судя по вашим комментариям, вы можете искать «сообщения/показ». Render по умолчанию использует представления текущего контроллера, но это можно легко переопределить.

render "posts/show" 
+0

Это вызывает у меня эту ошибку, но я думаю, что понимаю, к чему вы клоните.«Отсутствуют комментарии к шаблону/новое, приложение/новое с помощью: {: locale => [: en],: formats => [: html],: variantants => [],: handlers => [: erb,: builder,: raw ,: ruby,: coffee,: jbuilder]}. " –

+0

Jonathan, вы можете создать шаблон в app/views/comments/new.html.erb, чтобы устранить эту ошибку. Это теоретически вызовет «новое» представление или что-то в этом роде. –

+0

Спасибо, это сработало! –

Смежные вопросы