【问题标题】:Pass model errors through controllers in Rails通过 Rails 中的控制器传递模型错误
【发布时间】:2013-01-21 13:48:36
【问题描述】:

我有 2 个模型 - 项目和审查。项目 has_many review 和 Review belongs_to Project。当我打开项目(show REST 操作)时,我可以为其添加评论。但是从表单接受数据并保存的控制器在项目上是不同的(在ProjectsController中显示动作,在ReviewsController中创建Review动作)。

问题是我不明白 Review 模型是如何呈现错误的。如果我有 1 个控制器,我会这样做:

if @project.save
  respond_to do |format|
    format.js
    format.html {redirect_to :back, :notice => I18n.t("activerecord.attributes.project.added")}
  end
else
  render :action => :show
end

Rails 会在每个有错误的表单字段下呈现错误消息。不接受 Flash 消息。

【问题讨论】:

  • 嗨!是评论控制器中的代码吗?如果是,那不应该是@review.save吗?
  • 不,它只是示例。当然在评论控制器@review.save
  • 对不起,我还是没有得到你想要的。您可能需要添加更多详细信息。
  • 什么样的细节? 2 个模型,2 个控制器。如果我提交带有无效数据的评论创建表单,他们将创建评论控制器的操作。如果模型有验证错误,我应该渲染或重定向什么?

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


【解决方案1】:

在您的评论控制器中,尝试以下操作

def create
  @project = Project.find... # fetch the project
  @review = @project.reviews.build params[:review]
  @review.save

  render template: 'projects/show'
end

在项目页面中,检查@review是否有错误

# app/views/projects/show.html.erb
<% if @review && @review.errors.any? %>
  ...
<% end %>

【讨论】:

  • 它的工作,但也许你可以帮助我解决另一个问题?添加评论的表单我以这种方式创建:form_for([@project, Review.new], :validate => true, :remote => true) 我没有编写任何代码来检查是否模型在每种形式中都有错误或没有错误。在初始化程序中,我有 proc,会生成此错误(客户端验证 gem 的默认行为)。它也适用于服务器端验证。问题是:在我的情况下是否可以遵循这个约定?
  • 是的,这是可能的。我以前在关联上尝试过client_side_validation gem。由于您使用的是远程,您可以在 create 操作中添加一个 respond_to 块并添加一个 create.js.erb 文件。
  • 我的意思是,如果我在浏览器中禁用 JavaScript,我将看不到任何错误消息。
  • 对不起,我不明白你的意思。您说您正在使用依赖于 javascript 来显示错误消息的客户端验证,但您想禁用 javascript?
  • 不要看 gem 名称 :) 它有初始化程序,可以使用或不使用 javascript 呈现错误。它适用于简单(不是嵌套形式)。我禁用了 javascript,但仍然呈现错误。而且我没有任何代码。你可以在 /config/initializer/client_side_validation.rb 中找到它
猜你喜欢
  • 2016-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多