【问题标题】:Same controller action, but different redirect based on submitted param/view相同的控制器操作,但基于提交的参数/视图的不同重定向
【发布时间】:2014-03-25 12:36:27
【问题描述】:

我在 Rails 4 中有一个奇怪的问题,涉及我的一个模型的更新操作。

有 2 个视图允许用户编辑产品:标准 edit_product 视图和额外的准系统 edit_product_images 视图,可从桌面应用程序访问,不提供任何额外的应用程序布局。

当提交表单时,这两个视图都会导致更新操作。但是,虽然我希望完整的 Web 浏览器视图在保存后返回到 product#show 视图,但精简版应该在更新操作完成后重新加载 edit_product_images 页面。

当然,我可以创建另一个与现有更新操作非常相似的操作,但只是使用不同的重定向。然而,这似乎非常多余。相反,我打算在提交edit_product_images 表单时通过隐藏字段传递一个额外的:same_page => 1 参数。

在我的更新操作中,我有以下代码来检查 params[:same_page] == "1" 对于此更新操作是否为真:

products_controller.rb

def update

  respond_to do |format|

    if @product.update(product_params)

      format.html do
        if params[:same_page] == "1"
          render action: "edit_product_images", layout: false
        else
          redirect_to @product, notice: 'Product was successfully updated.'
        end  
      end

      format.json { head :no_content }

    else
      format.html { render action: 'edit' }
      format.json { render json: @product.errors, status: :unprocessable_entity }
    end
  end

end

不幸的是,尽管 if params[:same_page] == 1 子句似乎总是返回 false,所以我只是被重定向到 product#show 视图。我检查了日志,并在表单提交时传递了参数。为什么我的 if 语句会失败?

我在这里缺少什么?有没有更好的方法来处理这个功能?毕竟我只想要基于触发动作的原始视图的不同重定向 - 附加参数似乎是实现这一目标的最简单方法。不过,我愿意接受更好的解决方案。

感谢您的帮助。

【问题讨论】:

  • 可以分享一下edit_product_images页面提交表单时生成的服务器日志吗?

标签: ruby-on-rails forms redirect ruby-on-rails-4 controller


【解决方案1】:

如果隐藏字段是从表单传递的,那么它可能嵌套在product 哈希中。 由于您没有共享有问题的 params 哈希,我只能建议您使用 params[:product][:same_page] 而不是 params[:same_page] 看看它是否适合您。

您可以检查服务器日志中的params 哈希,看看same_page 到底是如何传入其中的。

【讨论】:

  • 当然,我不敢相信我一直在兜圈子,却错过了这么明显的错误。非常感谢!
【解决方案2】:

试试if params[:same_page] == true这可能会解决你的问题

【讨论】:

  • 它不起作用。正如在对 Oscar 的回答中所解释的那样,参数始终作为字符串传递,在本例中为“1”,它不等于 true。即使是像 true 这样的值,一旦用作参数,它本身也会被转换为字符串。
【解决方案3】:

尝试params[:same_page] == '1' 而不是params[:same_page] == "1"

【讨论】:

  • 我试过了,但是已经知道参数总是作为字符串传递的,这就是为什么你必须将参数与“1”进行比较,或者“true”而不是“true”来给出另一个例子。跨度>
  • 没错!检查我编辑的答案。基本上是单引号而不是双引号。
  • 它会有什么区别:'1' vs "1"?
  • 由于某些奇怪的原因,它在过去对我产生了影响? ://
  • 我不这么认为。你可能误判了什么。 “1”和“1”完全相同。在 Rails 控制台中尝试 "1" == '1'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-17
相关资源
最近更新 更多