我无法使用重定向和错误消息。根据我所读到的内容,当您使用重定向时,您无法显示表单错误,因此我尝试在失败后使用呈现。
我在主题页面上有一个新的帖子表单。网址是" 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进行渲染。
答案 0 :(得分:1)
<强>错误强>
问题与呈现表单的方式无关(render
或redirect
) - 这与您处理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
如果没有 - 请告诉我你得到的错误消息(我们可以调试)