Ruby on rails 我可以在Rails中嵌入表单的上方显示验证错误吗?
不幸的是,我被我的评论功能卡住了。Ruby on rails 我可以在Rails中嵌入表单的上方显示验证错误吗?,ruby-on-rails,forms,validation,ruby-on-rails-4,Ruby On Rails,Forms,Validation,Ruby On Rails 4,不幸的是,我被我的评论功能卡住了。注释模型与它的注释具有多态关联。下面是模型的草图: 此外,我还有一个publications控制器,它当然会显示一些内容、注释,还有一个内嵌的注释表单。关于这一点的另一个草图: 显示出版物及其评论表单 注释表单已提交,数据已发送到注释控制器的创建操作 不幸的是,数据未通过验证 我现在的问题是,如何在嵌入表单上方显示验证错误?我知道我可以使用flash显示错误,但是用户会丢失表单数据 def create @comment = Comment.new(co
注释
模型与它的注释
具有多态关联。下面是模型的草图:
此外,我还有一个publications
控制器,它当然会显示一些内容、注释,还有一个内嵌的注释表单。关于这一点的另一个草图:
注释
控制器的创建
操作flash
显示错误,但是用户会丢失表单数据
def create
@comment = Comment.new(comment_params)
@comment.commentable = find_commentable
if @comment.save
redirect_to polymorphic_url(@comment.commentable, anchor: 'comment-' + @comment.id.to_s)
else
# What do I need to do here?
end
end
我如何在出版物#show
中提供@评论
我在Rails 4.1上。这样做的方法是将以下代码添加到
出版物中的显示操作控件中:@comment=comment.new
(或@comment=@publication.comment.new
)。然后将某种类型的
类型的代码添加到出版物的show.html.erb
。最后,您的评论#create
操作中的else
应该是:render'publications/show'
这将显示错误,并允许您的注释表单处于
状态,因此它将显示在注释表单中键入的未验证内容。解决此问题的方法之一是创建一个特殊操作,用于在PublicationsController
和其他可注释控制器中创建注释(您可能希望创建一个模块,将其包含在所有可注释控制器中,以避免重复并干燥代码)
我没有时间检查一个测试Rails应用程序,所以我可能犯了一些打字错误或其他错误,或者忘记了上面代码中的某些内容。不过,我希望,这个想法很清楚。如果发现bug,请随意编辑
在您的出版物控制器
(和其他可注释控制器)中:
在show
中,这些可注释控制器的操作只需执行
def show
...
@commentable_class = self.class.to_s[0..-11].singularize.constantize
@comment = Comment.new
@commentable = instance_variable_get('@'+@comentable_class.to_s.underscore)
...
end
在注释的show
视图中,使用类似以下表单的内容添加新注释(基于提供的要点):
因此,我需要将所有显示操作逻辑添加到创建操作中?是的,您需要设置您当时需要的其他变量,如@publication=@comment.commentable
或任何合适的变量。感谢您的回答。不幸的是,这不是解决方案,因为它并不总是publications/show
作为Comment
是多态的。好的,因此您可能需要根据评论内容更改渲染内容。关键的教训是,您必须从create
操作中render
,才能显示评论信息,因为它未存储在数据库中,如果重定向将丢失。好的,我理解这是唯一的方法?我必须拼凑这样的字符串?你的出版物/节目视图(以及其他评论的节目视图)是什么样子的?我对显示“评论表单”的部分感兴趣。现在我们开始:那么,您在注释/表单中已经有@comment
部分,甚至还有@comment.errors.full_messages.each…
。如何在PublicationsController
和其他可注释控制器中创建@comment
?看起来您需要传递@comment的属性将url参数中的es重定向到控制器:@comment.commentable,操作::在出现错误时显示
,并从参数[]中选取它对不起,在GIST中是一个更新的版本。我在代码< >评论>控制器/<代码中添加了一个新的视图,并在验证错误上渲染它。不幸的是,它仍然不是完美的解决方案,因为用户看不到上面的出版物。它不再是嵌入的形式。顺便问一下,你是否考虑过使用SP创建表单中的注释?特别是新操作PublicationsController#添加注释
而不是CommentsController#创建
?这需要一些重写,但可能有助于获得理想的解决方案。您可以创建一个模块,将其包含在所有注释中以添加该操作,以避免代码重复多次。
def show
...
@commentable_class = self.class.to_s[0..-11].singularize.constantize
@comment = Comment.new
@commentable = instance_variable_get('@'+@comentable_class.to_s.underscore)
...
end
- if @comment.errors.any?
%section.errors
%p= t('errors.templates.body')
%ul
- @comment.errors.full_messages.each do |message|
%li= message
= form_for @comment, url: {controller: @commentable_controller, action: :add_comment} do |form|
= hidden_field_tag 'commentable_id', @commentable.id
- unless user_signed_in?
.row
.small-12.columns
= form.label :author
= form.text_field :author, required: true, pattern: '.{3,30}', title: t('errors.messages.not_in_between', from: 3, to: 30)
.row
.small-12.columns
= form.label :subject
= form.text_field :subject, pattern: '.{5,80}', title: t('errors.messages.not_in_between', from: 5, to: 80)
.row
.small-12.columns
= form.label :message
= form.text_area :message, required: true, pattern: '.{30,5000}', title: t('errors.messages.not_in_between', from: 30, to: 5000)
= form.submit class: 'small radius button right'