Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails RubyonRails:如何通过链接将参数从视图传递到控制器,而不在URL中显示参数_Ruby On Rails_Link To - Fatal编程技术网

Ruby on rails RubyonRails:如何通过链接将参数从视图传递到控制器,而不在URL中显示参数

Ruby on rails RubyonRails:如何通过链接将参数从视图传递到控制器,而不在URL中显示参数,ruby-on-rails,link-to,Ruby On Rails,Link To,我目前正在使用一个指向帮助器的链接,以便将标题、作者、图像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 ) %> 然后将调用new.html.erb。 这一切

我目前正在使用一个指向帮助器的链接,以便将标题、作者、图像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 ) %>
然后将调用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上?

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

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

我想我会选择第二种方法。

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

在URL中设置参数没有什么错。我们不应该把太多的注意力放在URL栏上显示的内容上,更不用说在?之后是什么了?。但是,如果您有某些需要(即客户的坚持)删除它们,您有几种选择,John提到了其中两种

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

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

  • 也许您可以在控制器中对参数进行编码和解码,以阻止用户修改url?可能有点过分,但是

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

    为什么不把它们写到会议上呢?看起来这里的数据可能少于4k。记得擦一下。

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