Ruby on rails RubyonRails:如何通过链接将参数从视图传递到控制器,而不在URL中显示参数
我目前正在使用一个指向帮助器的链接,以便将标题、作者、图像url和isbn等参数传递回控制器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。 这一切
<%= 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风格的,因为它生成的表单必须提交才能更改服务器上的状态。因此,您的选择可能是:
也许您可以在控制器中对参数进行编码和解码,以阻止用户修改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"