在rails中添加比较功能

时间:2011-07-30 19:03:14

标签: html ruby-on-rails ruby button

我在添加某项功能时遇到了一些麻烦。我正在买卖网站,我希望能够比较帖子。这是我到目前为止所拥有的:

在帖子视图中:

<%= button_to "Add to Compare", :action => "addCompare" %>

在相应的控制器中:

@@a = Array.new()

def addCompare
   @@a << Post.id
end

所以,我想要做的就是将帖子的id添加到数组@@ a。当我测试这个时,我点击“添加到比较”按钮,我很受欢迎:

缺少模板

缺少模板帖子/ addCompare与{:locale =&gt; [:en,:en],:formats =&gt; [:html],:handlers =&gt; [:rxml,:rjs,:builder,:rhtml ,:erb]}在视图路径“/ home / mja32 / 470repo / traders / app / views”,“/ var / lib / gems / 1.8 / gems / devise1.4.2 / app / views”

所以我猜它正试图重定向到一个视图。我该如何阻止它这样做?我想要这个按钮所做的就是将帖子的id添加到数组中,仅此而已。

提前致谢,

马特

1 个答案:

答案 0 :(得分:3)

首先,将持久数据存储在控制器的类变量中并不会按照您希望的方式工作。我们无法保证@@a下一次addCompare电话中的addCompare数组相同;例如,您的下一个addCompare电话可以由其他进程处理。此外,如果两个不同的客户呼叫@@a会发生什么?你真的想把他们的数据混合在一起吗?可能不是。您的第一个任务是将render :nothing => true, :status => :ok 替换为真实的每用户持久性存储。

如果您想从控制器中完全不返回任何内容,请在controller method结束时执行此操作:

posts/addCompare

这将告诉Rails已经呈现了某些内容,因此它不需要尝试默认呈现操作(即呈现:remote视图)并仅向客户端返回200个状态代码

一旦到位,您可能希望使用:remote => true对您的按钮进行AJAX化:

  

<%= button_to "Add to Compare", { :action => "addCompare" }, { :remote => true } %> - 如果设置为true,将允许Unobtrusive JavaScript驱动程序控制提交行为。默认情况下,此行为是ajax提交。

所以这个:

button_to

请注意,button_to(name, options = {}, html_options = {}) 如下所示:

:action

并且options适用于:remotehtml_options适用于{},因此您必须使用options明确设置哈希值;你可以将<%= button_to "Add to Compare", { :action => "addCompare" }, :remote => true %> 包裹在大括号中:

{{1}}

但我更喜欢手工包装它们的一致性。