Rails的综合ajax页面

时间:2012-11-19 03:23:36

标签: javascript ruby-on-rails ajax ruby-on-rails-3

我有一个名为ProductsController的Controller。在那个控制器中有几个动作,如袜子和毛巾。我也有袜子和毛巾的意见。袜子和毛巾的视图页面内部具有完全相同的形式。我将在两个文件中使用ajax表单。由于两个视图中的表单完全相同,因此我认为为调用ajax时要调用的操作创建多个ajax js文件毫无意义。如何让两个动作袜子和毛巾分别调用相同的js.erb文件而不是socks.js.erbtowels.js.erb

我的控制器和动作袜子。

def socks
 @socks = Socks.all

 respond_to do |format|
   format.html # index.html.erb
   format.json { render json: @socks }
   #ok, I get the line below is needed for ajax. Is there something I could add for
   #the action not to call socks.js.erb and instead a different file, say ajax.js.erb
   format.js
 end

end

2 个答案:

答案 0 :(得分:2)

我认为你在这里寻找render。使用它,您可以渲染另一个动作的模板/视图。请参阅文档:Layouts and Rendering

render 'products/show'
render :template => 'products/show'
render "/u/apps/warehouse_app/current/app/views/products/show"

答案 1 :(得分:0)

正如Sergio正确地说,你可以使用渲染命令完成这项工作。基本上,在socks和towel动作中,当respond_to用于JS时,你可以渲染一个常见的ajax.js.erb文件。

我正在添加这个答案,但是因为你的评论。看来你的袜子和毛巾方法以及形式和相关的反应非常相似。如果是这种情况,为什么不使用单一动作?基本上,您可以使用URL参数在ProductsController操作中指定产品的性质。

所以你会有类似的东西:

def ProductsController

   def index
       if params[:nature] == "socks"
          @socks = Sock.all
          respond_to do |format|
             format.html # index.html.erb
             format.json { render json: @socks }
             format.js
          end
       elsif params[:nature] == "towels"
          @towels = Towel.all
          respond_to do |format|
             format.html # index.html.erb
             format.json { render json: @towels }
             format.js
          end
       end
   end
end

现在您需要2个视图文件index.html.erb和index.js.erb,然后您可以再次检查params值并显示相关集合。

这不是一个理想的解决方案,但更多的是快速修复。

如果失败了,您还可以在ProductsController中定义一个新的操作方法,并让两个表单指向该方法。