在两个请求之间传递长列表

时间:2012-11-13 12:05:21

标签: ruby-on-rails

我有一个视图,用户可以从数据库中观察部分对象:

class SyncController < ApplicationController
   def one
     @ids = get_ids(...)  # ids of objects, which user can see on the view
   end
end

在同一视图中,有一个链接必须通过此@ids删除数据库中的对象。所以我需要将这个id列表([10000,100001,100009 ...])传递给下一个方法。要做到这一点,我在我的观点上创建了链接:

<%= link_to "mark_as_read", { :controller => 'Sync', :action => "two", :ids => @ids }, :class => "mark_as_read_link", :remote => true %>

在控制器中,我正在遍历此列表并删除对象:

def two
   params[:ids].each { |id|
    .....
   }
end

我只是想知道是否有更好的方法来传递这个ID列表,因为它可能很长,而且我不确定该链接没有任何限制。

1 个答案:

答案 0 :(得分:2)

首先,URL的长度限制为大约2000个字符。 (见What is the maximum length of a URL?)所以你不能以这种方式传递太多的ID。

其次,GET请求不受跨站请求伪造保护作为POST请求。

所以我认为一个更好的解决方案是创建一个表单并使用隐藏的INPUT标记保存id。

BTW,您可以通过一次调用删除对象,而不是逐个删除对象:YourModel.delete_all(id: params[:ids])