0

我有一个名为 ProductsController 的控制器。在该控制器中有几个动作,例如袜子和毛巾。我也有袜子和毛巾的意见。袜子和毛巾的视图页面内部具有完全相同的形式。我将在表单的两个文件中使用 ajax。由于两个视图中的表单完全相同,我认为创建多个 ajax js 文件以在调用 ajax 时调用操作是没有意义的。我怎样才能让袜子和毛巾都调用同一个 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
4

2 回答 2

2

我想你在render这里寻找。使用它,您可以呈现另一个动作的模板/视图。请参阅文档:布局和渲染

render 'products/show'
render :template => 'products/show'
render "/u/apps/warehouse_app/current/app/views/products/show"
于 2012-11-19T03:33:59.463 回答
0

正如Sergio所说,您可以使用render命令完全做到这一点。基本上,在socks 和towels 动作中,当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 ,您可以在那里再次检查参数值并显示相关集合。

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

如果做不到这一点,您还可以在 ProductsController 中定义一个新的操作方法,并让两个表单都指向它。

于 2012-11-19T07:08:10.850 回答