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'