如果验证失败,则Rails重定向

时间:2015-06-09 14:26:45

标签: ruby-on-rails

在Rails 3.2应用程序中,我对附件类型进行了验证。

附件模型:

class Attachment < ActiveRecord::Base
  validates_presence_of :name
  validates_attachment_presence :attach, :message => "No file selected"
  validate :check_type


  def check_type
    if self.costproject_id != nil
      if self.attach_content_type != 'application/pdf'
        self.errors.add(:pdf, " ONLY")
        return false
      end
    end
  end

但是,return false将我发送到此网址:

http://localhost:3000/attachments

我希望它返回上一个输入屏幕:

http://localhost:3000/attachments/new?costproject_id=2

我如何做到这一点?

谢谢!

UPDATE1

重定向可能必须在控制器中进行?

        format.html { render action: "new" }

附件控制器:

  # POST /attachments
  # POST /attachments.json
  def create
    @attachment = Attachment.new(params[:attachment])

    respond_to do |format|
      if @attachment.save
        format.html { redirect_to session.delete(:return_to), notice: 'Attachment was successfully created.' }
        format.json { render json: @attachment, status: :created, location: @attachment }
      else
        format.html { render action: "new" }
        format.json { render json: @attachment.errors, status: :unprocessable_entity }
      end
    end
  end

我更改了这一行:

format.html { render action: "new" }

要:

 format.html { redirect_to request.referer }

现在它又回到了我想要的地方。但是,我已经失去了错误 - 他们不会显示。

2 个答案:

答案 0 :(得分:0)

试试这个。

替换

 return false

使用

redirect_to request.referrer || root_url

注意:root_url这里是一个catchall。这也是Rails 4,我不知道它是否也适用于Rails 3.不过值得一试。

调试提示

首先确认一个简单的redirect_to root_url(或您用于root的名称)在您的控制器中工作

redirect_to root_url

然后,一旦redirect_to确认工作,请专注于获取REST接口“请求”。信息。这里有一个Rails 3讨论可能会对你有所帮助。

How to get request referer path?

答案 1 :(得分:0)

帮助您了解此处发生的事情。当你转到/ attachments / new时,你正在渲染一个表单。当您按提交时,您正在向/ attachments发送POST请求,该请求会调用create操作。

你创造的动作似乎是坚实而又自然的。但是,当您render action: "new"出现错误时,它不是完整重定向,而是在当前操作的上下文中呈现表单。

通常情况下这很好,因为idomatic rails会让你在new和create中构建一个非常相似的模型对象,而helper的表单会渲染该对象。但是,您的新操作是基于大量的查询参数创建各种对象,我猜测这就是您看到不喜欢的行为的原因。

我希望您的最终解决方案将涉及以某种方式将所有这些参数添加到附件中,如果他们不需要保存到数据库,您可以在附件上创建attr_accessors

  # Model
  class Attachment < ActiveRecord::Base
    attr_accessor :worequest_id, :workorder_id # etc
  end

  # View
  <%= form_for @attachment do |f| %>
    <%= f.hidden :worequest_id %>
  <% end %>

以这种方式接近它,你的帖子请求参数将看起来像

  {
    attachment:
    {
      worequest_id: 1,
      # etc
    }
  }

并且您还需要重新设计查询参数以将个体ID嵌套在附件中

/attachments/new?[attachment][worequest_id]=1

这样你就可以在两个动作中用params建立附件:

Attachment.new(params[:attachment])

现在你当前的创建动作应该或多或少地按预期工作,因为它现在是它的惯性轨道。

您仍然无法使用相同的查询参数获取新操作,但由于您正在使用这些参数并将其填充到表单上的隐藏字段中,因此当您尝试时它们不会丢失并且无法创造。在任何情况下,除非你做一些事情来保持请求之间的值,POST到/ attachments将消除ery params。