2010-09-07 71 views
12

我目前使用的link_to助手中查看通过如标题,作者,图片网址参数的参数和ISBN回控制器Ruby on Rails的:如何从视图传递参数用的link_to到控制器没有显示出来的URL

<%= 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)然后

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将被调用。 这是所有工作正常,但该网址显示的所有参数

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中显示?

+0

为什么你需要它?这些参数来自哪里?它来自用户输入还是来自哪里?当我看着它时,似乎你正在以一种奇怪的方式做某件事。请解释你为什么这样做,因为可能有更好的方法。 – klew 2010-09-07 18:03:03

+0

这些参数由amazon在xml格式化输出中返回。我有一个搜索栏,允许用户查询亚马逊数据库(使用亚马逊ECS)。每次查询后,我的网站将在表格中输出前10个项目。每个项目都有一个按钮,允许用户选择要销售的项目。我需要这些参数以另一个视图的形式显示。这些参数最终会保存到我的数据库中。我不喜欢显示参数的原因是用户可以手动操作URL。 – user1994764 2010-09-07 22:23:07

+0

它看起来不像用户的隐藏参数将解决你的问题。恶意用户将始终能够找出参数并对其进行操作。通过实现您的方法,您可以使代码更复杂,但实际上并没有以任何方式提高安全性 – paulus 2012-04-28 10:02:01

回答

2

有两种选择,我可以看到两者涉及的JavaScript:

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

我想我会用第二种方法。

4

POST可用于将参数从URL中移出并放入请求中,但这不是“正确的”或最佳做法。 HTTP标准是这样的,非GET请求只能用于改变服务器状态的请求。这就是为什么当刷新为响应POST而生成的页面时您会收到警告。

在URL中使用参数没有任何问题。如此多的焦点不应该放在URL栏上,更不用说什么了。但是,如果你有一些需要(即坚持客户)去除它们,你有几种选择,John提到了其中的两种。

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

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

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

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

为什么不把它们写入会话?看起来你可能在那里的数据少于4k。只记得擦拭它。

相关问题