Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Rails的全面ajax页面_Javascript_Ruby On Rails_Ajax_Ruby On Rails 3 - Fatal编程技术网

Javascript Rails的全面ajax页面

Javascript Rails的全面ajax页面,javascript,ruby-on-rails,ajax,ruby-on-rails-3,Javascript,Ruby On Rails,Ajax,Ruby On Rails 3,我有一个名为ProductsController的控制器。在那个控制器中有几个动作,比如袜子和毛巾。我还可以看到袜子和毛巾。袜子和毛巾的查看页面在里面有完全相同的形式。我将在表单的两个文件中使用ajax。由于两个视图中的表单完全相同,我认为在调用ajax时为要调用的操作创建多个ajax js文件是毫无意义的。如何让actions socks和Towers分别调用相同的js.erb文件而不是socks.js.erb和Towers.js.erb 我的控制器和动作袜 def socks @socks

我有一个名为ProductsController的控制器。在那个控制器中有几个动作,比如袜子和毛巾。我还可以看到袜子和毛巾。袜子和毛巾的查看页面在里面有完全相同的形式。我将在表单的两个文件中使用ajax。由于两个视图中的表单完全相同,我认为在调用ajax时为要调用的操作创建多个ajax js文件是毫无意义的。如何让actions socks和Towers分别调用相同的js.erb文件而不是
socks.js.erb
Towers.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

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

正如正确所说的,您可以使用render命令精确地执行此操作。基本上,在socks和Towers动作中,当Response_to是for 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中定义一个新的操作方法,并让两个表单都指向该方法。

您的意思是什么?Ajax在控制器中调用land,而不是一些javascript。你是对的。然后Rails会自动调用一个JavaScript嵌入的Ruby(.js.erb)文件,该文件与操作同名。我想知道的是,我怎样才能拥有一个所有控制器都发送到的js文件。对不起,我把你弄糊涂了。我很难准确地描述我想要什么。我认为那不是我想要的。我重写了我的问题,给出了一个真实的例子。你为什么这么认为?它会做你想做的。对我来说更大的问题是如何开始工作。我会玩弄它,把它弄明白。这是我第一次在rails中创建ajax,请耐心等待。
render
正是您想要的。
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