【问题标题】:Ruby on Rails: How to pass parameters from view to controller with link_to without parameters showing up in URLRuby on Rails:如何使用 link_to 将参数从视图传递到控制器,而 URL 中不显示参数
【发布时间】:2010-09-07 15:50:45
【问题描述】:

我目前在 View 中使用 link_to 助手将 title 、 author 、 image_url 和 isbn 等参数传递回控制器

<%= link_to 'Sell this item',new_item_path(:title => title, :author => authors, :image_url=>image, :image_url_s=>image_s, :isbn=>isbn, :isbn13=>isbn13 ) %>

控制器随后会将参数分配给一个对象,以便稍后在 View 中(在 new.html.erb 中)中使用该对象

def new
      @item = Item.new

      @item.title = params[:title]
      @item.author = params[:author]
      @item.image_url = params[:image_url]
      @item.image_url_s = params[:image_url_s]
      @item.isbn = params[:isbn]
      @item.isbn13 = params[:isbn13]

      respond_to do |format|
        format.html # new.html.erb
        format.xml  { render :xml => @item }
      end
end

new.html.erb 然后将被调用。 一切正常,但 url 显示了所有参数

http://localhost:3000/items/new?author=Michael+Harvey&image_url=http://ecx.images-amazon.com/images/I/51vt1uVjvLL._SL160_.jpg&image_url_s=http://ecx.images-amazon.com/images/I/51vt1uVjvLL._SL75_.jpg&isbn13=9780307272508&isbn=0307272508&title=The+Third+Rail

有什么方法可以让参数不显示在 URL 上?

【问题讨论】:

  • 为什么需要它?这些参数从何而来?是来自用户输入还是来自哪里?在我看来,您似乎正在以一种奇怪的方式做某事。请解释你为什么这样做,因为可能有更好的方法。
  • 这些参数由亚马逊以 xml 格式的输出返回。我有一个搜索栏,允许用户查询亚马逊数据库(使用亚马逊 ECS)。每次查询后,我的网站都会将输出中的前十项填充到表中。每个项目都有一个按钮,允许用户选择要出售的项目。我需要将这些参数显示在另一个视图中的表单中。这些参数最终会保存到我的数据库中。我不喜欢显示参数的原因是用户可以手动操作 URL。
  • 看起来对用户隐藏参数并不能解决您的问题。恶意用户将始终能够找出参数并操纵它们。通过实施您的方法,您使代码更加复杂,但它实际上并没有以任何方式提高安全性

标签: ruby-on-rails link-to


【解决方案1】:

也许您可以对参数进行编码并在控制器中对其进行解码,以阻止可能想要修改 url 的用户?可能有点矫枉过正,但是...

>> author=ActiveSupport::Base64.encode64("author=jim")
=> "YXV0aG9yPWppbQ==\n"
>> ActiveSupport::Base64.decode64(author)
=> "author=jim"

【讨论】:

    【解决方案2】:

    POST 可用于将参数移出 URL 并移入请求,但这不是“正确”或最佳实践。 HTTP 标准规定,非 GET 请求仅用于更改服务器状态的请求。这就是您在刷新响应 POST 生成的页面时收到警告的原因。

    在 URL 中包含参数并没有错。不应过多关注 URL 栏上显示的内容,更不用说 ? 之后的内容了。但是,如果您有一些需要(即客户的坚持)删除它们,您有多种选择,其中两个约翰提到了。

    我假设您的“新”操作是 REST 样式的,因为它生成的表单必须提交才能更改服务器上的状态。因此,您的选择可能是:

    1. 使用 POST,即使它不符合标准。不推荐。
    2. 使用 AJAX GET。这需要 javascript,而 ajax 处理确实会增加一些要求,例如使用 JS 框架和测试。
    3. 使用 GET(或 POST),但捕获参数并存储它们,将用户重定向回另一个显示这些存储值的干净 URL。您可以将它们存储在会话哈希中,或创建它们的数据库记录。实际上,在这种情况下您确实应该使用 POST,因为您通过存储这些参数有效地更改了服务器上的状态。在这种情况下,如果用户刷新他被引导到的页面,这些参数将被保留。这有效地消除了刷新时的浏览器警告,我当然很感激。

    【讨论】:

      【解决方案3】:

      我可以看到两个选项,它们都涉及 JavaScript:

      • 让链接填充参数的隐藏表单字段,然后使用 HTTP POST 请求提交表单
      • 让链接向控制器操作提交 AJAX 请求(使用 HTTP GET,除非单击链接会更改服务器端状态,在这种情况下应使用 POST)

      我想我会采用第二种方法。

      【讨论】:

        【解决方案4】:

        为什么不将它们写入会话?看起来您那里的数据可能少于 4k。记得把它擦干净。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-10-12
          • 1970-01-01
          • 2013-03-24
          • 1970-01-01
          • 2015-07-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多