我有一个名为ProductsController的Controller。在那个控制器中有几个动作,如袜子和毛巾。我也有袜子和毛巾的意见。袜子和毛巾的视图页面内部具有完全相同的形式。我将在两个文件中使用ajax表单。由于两个视图中的表单完全相同,因此我认为为调用ajax时要调用的操作创建多个ajax js文件毫无意义。如何让两个动作袜子和毛巾分别调用相同的js.erb文件而不是socks.js.erb
和towels.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
答案 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中定义一个新的操作方法,并让两个表单指向该方法。