【问题标题】:ActiveRecord validations + a DRY way to display errors?ActiveRecord 验证 + 显示错误的 DRY 方式?
【发布时间】:2019-11-29 16:02:41
【问题描述】:

我想捕获并显示附加到对象的 ActiveRecord 资源的验证错误(此处::album_artwork)。

我正在遵循 Amit Suroliya 关于在表单中显示错误的建议(f.object.errors ...,发现 here)。关注guides.rubyonrails.com guide () 会导致表单首次加载时出现错误(在用户提交之前)。

代码:

# album.rb

  has_one_attached :album_artwork

  validates :name,          presence: { message: 'Album should have a title.' }
  validates :release_date,  presence: { message: 'Album should have a release date.' }
  validates :album_artwork, presence: { message: 'Album should have an artwork.' } # not working :(
#albums_controller.rb

def new
  @album = Album.new
  @album.tracks.build # Album has_many Tracks (doesn't matter here)
end


def create
  @album = Album.new(album_params)

  respond_to do |format|
    if @album.save
      format.html { redirect_to @album, flash: { success: "Album added" } }
      format.json {  }
    else
      format.html { render 'albums/new', flash: { error: "Something wrong happened :(" } }
      format.json {  }
    end
  end
end
# albums/new.html.erb

<%= form_for @album, url: {action: 'create'} do |f| %>

  <% if f.object.errors.any? %>
     <div class="alert alert-danger">
      <h4>Errors :</h4>
      <ul>
        <% f.object.errors.full_messages.each do |message| %>
          <li><%= message %></li>
        <% end %>
      </ul>
    </div>
  <% end %>

  <%= render 'albums/form_new', f: f %>

<% end %>

有 3 点我无法找出最佳(或任何)解决方案:

  • 如何验证 :album_artwork 对应的 file_field
  • 当验证失败时,URL 指向 /albums 而不是 /albums/new(但是,/albums/new 会显示,但如果我刷新,我将被重定向到 /albums
  • 是否有任何方便的方法可以使显示错误的代码干燥? (辅助渲染部分?)

我们将不胜感激地接受任何帮助、建议或批评!

祝你有美好的一天

【问题讨论】:

    标签: ruby-on-rails ruby model-view-controller activerecord


    【解决方案1】:

    1 has_one_attached 启用方法attached?。您可以定义自己的验证方法,使用它来执行验证。 ActiveStorage(has_one_attached 的来源)本身还不支持验证。它会在 Rails 6 中,但我假设你没有使用这个版本的 RAILS。您甚至可以将验证移至外部验证器并使用它来验证文件的存在、大小、类型等。https://guides.rubyonrails.org/active_record_validations.html#validates-with 从模型中迁移验证通常被认为是长期的良好做法。

    2 出现错误时尝试使用重定向,就像表单成功时一样(而不是渲染)。

    3 是的,您可以将负责显示错误的部分移动到易于在应用程序中访问的部分中,并在出现错误的情况下以表单形式呈现(或始终呈现,但不会如果没有错误,则显示其中的任何内容)

    另外,在提交问题时,请尝试指定究竟是什么不起作用,您描述验证不起作用的方式有点含糊。

    另外,我个人建议使用 haml 而不是 erb。但这只是因为你提到你想要一些建议;)

    【讨论】:

    • 非常感谢您的精确,下次我会尽量精确。我在教程中看到有人使用haml,它看起来很棒! (这里没用过,第一个项目)
    • 当然可以。如果您一开始对语法有疑问,可以在线使用 erb -> haml 转换器,这可能会有所帮助。
    • 再次感谢,我迫不及待地想完成这个项目并尝试 haml !如果你想了解URL问题,如果我选择使用redirect_to / redirect_back,变量将不会被传递(因此不会显示错误)。但是如果我选择 render action: :new,turbolinks 会弄乱我的 URL (github.com/turbolinks/turbolinks/issues/60)... 在实现 AJAX 之后删除 turbolinks 对我来说看起来最简单,但我会在后面做(并将阅读有关该问题的更多信息)
    猜你喜欢
    • 1970-01-01
    • 2011-08-17
    • 2020-02-25
    • 1970-01-01
    • 2018-12-05
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    • 1970-01-01
    相关资源
    最近更新 更多