显示表单错误消息

时间:2014-07-14 02:34:57

标签: ruby-on-rails ruby forms

我无法使用重定向和错误消息。根据我所读到的内容,当您使用重定向时,您无法显示表单错误,因此我尝试在失败后使用呈现。

我在主题页面上有一个新的帖子表单。网址是" topic / 1"。如果您发布有关该主题的帖子并且输入有问题,我希望它返回主题/ 1的页面并显示错误,我无法弄清楚如何让它返回。重定向(:back)执行我想要的但不显示表单错误。

主题的show.html页面上的表单:

<%= form_for(@post) do |f| %>
<%= render 'shared/post_error_messages' %>

<%= f.label :title, "Post Title" %>
<%= f.text_field :title %>

<%= f.label :content %>
<%= f.text_field :content %>

<%= f.hidden_field :parent_id, value: 0 %>
<%= f.hidden_field :topic_id, value: @topic.id %>
<%= f.hidden_field :user_id, value: current_user.id %>

<%= f.submit "Create Post" , class: "btn btn-small btn-primary" %>
<% end %>

在帖子控制器中创建动作

def create

    @post = Post.new(post_params)
    @topic = Topic.find_by(id: params[:topic_id])
    if @post.save
    redirect_to @post
else

    @topic = Topic.new
    render "/topics/show"  
end
end

我想我主要尝试使用表单最初所在页面中的id进行渲染。

2 个答案:

答案 0 :(得分:1)

<强>错误

问题与呈现表单的方式无关(renderredirect) - 这与您处理ActiveRecord的方式有关对象

当您使用form_for时,Rails会将任何错误附加到@active_record_object.errors方法中。这将允许您调用以下内容:

form_for error messages in Ruby on Rails

<%= form_for @object do |f| %>
  <% @location.errors.full_messages.each do |msg| %>
      <li><%= msg %></li>
   <% end %>
<% end %>

这仅适用于您正确创建ActiveRecord对象的情况,而您似乎正在做

-

<强>嵌套

#config/routes.rb
resources :topics do 
   resources :posts, path: "", path_names: {new: ""}, except: [:index] #-> domain.com/topics/1
end

使用nested <%= form_for [@topic, @post] do |f| %> ... <% end %> 路线会更好:

topics_posts_path

这允许您创建一个将路由到#app/controllers/topics_controller.rb Class TopicsController < ApplicationController def new @topic = Topic.find params[:topic_id] @post = Post.new end def create @topic = Topic.find params[:topic_id] @post = Post.new post_params end private def post_params params.require(:post).permit(:attributes) end end 的表单,这基本上就是您所需要的。然后控制器将通过使用以下内容来平衡:

{{1}}

答案 1 :(得分:0)

你正在用一个全新的空主题覆盖原始发现的主题 - 这不应该是必要的,这会导致与之相关的帖子消失。

此外 - 如果您的主题和帖子相关 - 您应该在相应的关联@topic.posts上创建帖子,而不是主Post类。

@topic.posts.new表示帖子的topic-id会自动使用@ topic.id的值更新...这意味着您无需在表单的hidden-field中设置它。 事实上,如果你不这样做会更好 - 只需完全删除那个隐藏的字段。

如果您在第一次添加新帖子时添加(例如在主题/节目中),那么您将不需要将值传递给隐藏字段。

此外,我也会对服务器端的所有其他隐藏字段执行相同的操作。你真的不希望用户使用firebug来破解表单并添加其他用户的id ...所以在创建操作中这样做并且不要打扰隐藏字段

这应该有效:

def create    
    @topic = Topic.find_by(id: params[:topic_id])

    @post = @topic.posts.new(post_params)
    @post.user = current_user
    @post.parent_id = 0

    if @post.save
        redirect_to @post
    else
        render "/topics/show"  
    end
end

如果没有 - 请告诉我你得到的错误消息(我们可以调试)