我在添加某项功能时遇到了一些麻烦。我正在买卖网站,我希望能够比较帖子。这是我到目前为止所拥有的:
在帖子视图中:
<%= 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添加到数组中,仅此而已。
提前致谢,
马特
答案 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
适用于:remote
但html_options
适用于{}
,因此您必须使用options
明确设置哈希值;你可以将<%= button_to "Add to Compare", { :action => "addCompare" }, :remote => true %>
包裹在大括号中:
{{1}}
但我更喜欢手工包装它们的一致性。