【问题标题】:How to render validation errors of form partial - Rails如何呈现表单部分的验证错误 - Rails
【发布时间】:2016-01-27 00:55:05
【问题描述】:

我正在构建一个自定义博客。我有postscomments

我通过个别帖子的部分显示操作来渲染 cmets。

帖子控制器

 class Blog::PostsController < Blog::BaseController

  def show
    @post = Post.find_by_permalink(params[:id])
    @comment = Comment.new(:post => @post)
  end

end

cmets 控制器

class Blog::CommentsController < Blog::BaseController

  def create
    @comment = Comment.new(comment_params)
    if @comment.save
      flash[:success] = "Comment successfully created!"
      redirect_to blog_post_url(@comment.post)
    else
      flash[:warning] = "Something went wrong, try again. If problem persists please let our team know about it!"
      redirect_to :back
    end
  end

  private
      def comment_params
        params.require(:comment).permit(:body,:name,:email,:user_id,:post_id)
      end
end

show.html.erb

<div class="row post-container">
  <div class="large-offset-1 large-7 medium-12 columns post-content">
    <h1 class="post-title"> <%= link_to @post.title, blog_post_path(@post) %> </h1>
    <p class="published-date"><em>Published on <%= l @post.published_at, format: :date %></em></p>

    <div class="post-body">
      <%= @post.body.html_safe %>
      <%= render partial: "blog/comments/comment", post: @post %>
    </div>
  </div>
  <div class="large-4 columns sidebar">
    sidebar
  </div>
</div>

cmets 部分形式

<%= form_for [:blog,@comment] do |f| %>
  <%= render 'blog/shared/error_messages', object: f.object %>

  <div class="field panel">
    <%= f.label :name %><br>
    <%= f.text_field :name,class: 'form-control' %>
  </div>

  <div class="field panel">
    <%= f.label :email %><br>
    <%= f.text_field :email,class: 'form-control' %>
  </div>

  <div class="field panel">
    <%= f.label :body, "Comment" %><br>
    <%= f.text_area :body,class: 'form-control' %>
  </div>

  <% if logged_in? %>
    <%= f.hidden_field :user_id, value: current_user.id %>
  <% end %>

  <%= f.hidden_field :post_id %>



  <div class="actions">
    <%= f.submit "Create comment", class:"btn btn-danger btn-block" %>
    <a class="btn btn-warning btn-block cancel">Cancel</a>
  </div>
<% end %>

部分错误消息

<% if object.errors.any? %>
  <div id="error_explanation">
    <div class="errors-alert text-center">
      The form contains <%= pluralize(object.errors.count, "error") %>.
    </div>
    <ul>
    <% object.errors.full_messages.each do |msg| %>
      <li class="errors-alert-item text-center"><%= msg %></li>
    <% end %>
    </ul>
  </div>
<% end %>

我尝试在 cmets 模型上进行验证,但即使正确重定向回来,它也不会显示它们。

我知道我必须使用渲染而不是重定向,但我不知道要渲染什么。这是我想要弄清楚的,因为我没有渲染新操作。

【问题讨论】:

  • 简单方法:使用gem weak_parameter验证参数:D
  • 如果有不使用宝石的解决方案,我会更喜欢它。
  • 你的blog/shared/error_messages 的内容是什么,或者这本质上是个问题?
  • @ItayGrudev 我已将错误消息的内容部分放置。它只是一个通用的错误生成器,它接受一个对象来显示特定于该对象的错误。在这种情况下, cmets 对象。问题是即使验证有效,也没有显示错误消息,这可能是因为附加到对象的错误消息在某处丢失了。

标签: ruby-on-rails ruby ruby-on-rails-4 parameters partials


【解决方案1】:

重写您的Blog::CommentsController 控制器create 操作,以便它重新呈现表单而不是重定向到上一页。这样错误将呈现在页面上。

class Blog::CommentsController < Blog::BaseController

  def create
    @comment = Comment.new(comment_params)
    if @comment.save
      flash[:success] = "Comment successfully created!"
      redirect_to blog_post_url(@comment.post)
    else
      flash[:warning] = "Something went wrong, try again. If problem persists please let our team know about it!"
      @post = @comment.post
      render 'blog/post/show'
    end
  end

end

这样,您将重新渲染来自CommentsControllershow 操作,并显式为其提供正确的@post,以便它在视图中可用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-13
    • 2011-09-18
    • 1970-01-01
    • 2017-10-20
    相关资源
    最近更新 更多