我正在使用Ruby on Rails制作一个单页应用程序(这是我有史以来的第一个ruby项目,因此我肯定还缺少很多东西)。
因此,我有一个带有一些链接的侧菜单,该页面的右侧应该容纳一个容器,该容器将填充部分页面的某些内容。
我现在使用的典型菜单链接看起来是这样的:

 <%= link_to t('my-groups'), :controller => 'dashboard', :action => 'mygroups', :remote => true %>


我有一个仪表板控制器,这是它的简化版

 class DashboardController < ApplicationController
   def mygroups
    respond_to do |format|
      format.js
   end
  end


我有一个仪表板模板,其中包含容器div

<div class="right_col" role="main">
    <h2>This is the default content of center page</h2>
</div>


这是它的routes.rb路径:

get 'dashboard/mygroups' => 'dashboard#mygroups'


我的仪表板模板的底部还有一个页面的局部页面,名为_mygroups.html.erb和一个名为mygroups.js.erb的javascript文件,称为我的控制器操作
看一下结构截图
javascript - 在Ruby on Rails中进行远程(ajax)调用的正确方法-LMLPHP

该js.erb文件的内容为:

$('.right_col').html("<%= escape_javascript(render(:partial => 'mygroups')) %>");


一切正常,部分内容出现在容器中,单击链接就可以了。
但是仍然有2个问题我无法在google上找到答案

问题部分:

1)它可以与Ajax调用一起使用,但是如果我只是将此http://localhost:3000/dashboard/mygroups放在浏览器的导航行中并按Enter,它将给我这个错误


  DashboardController#mygroups中的ActionController :: UnknownFormat
  ActionController :: UnknownFormat
  
  提取的来源(第70行左右):
  
  def mygroups
      response_do |格式|
        format.js结束结束


在这种情况下,如何避免这种情况,而只重定向到索引?
我知道ajax使用POST,但是我尝试使用post而不是get.routes.rb来执行此操作,但它根本不起作用

2)如果我对不同的部分页面有很多操作,该为每个操作创建一个新的js.erb文件怎么办?不能只用一个文件以某种简单的方式完成它吗?

3)是否可以不明确指定此链接上的控制器和动作?

<%= link_to t('my-groups'), :controller => 'dashboard', :action => 'mygroups', :remote => true %>


我的意思是,由于这应该是POST ajax请求,因此为什么需要向用户显示类似http://localhost:3000/dashboard/mygroups的网址?

最佳答案

在控制器中添加format.html,例如:

 class DashboardController < ApplicationController
   def mygroups
    if request.xhr?
      respond_to do |format|
        format.js
       end
    else
      redirect_to root_url
    end
  end


您可以在link_to标记中添加网址,例如:

<%= link_to t('my-groups'), '/dashboard/mygroups', :remote => true %>

关于javascript - 在Ruby on Rails中进行远程(ajax)调用的正确方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43511596/

10-09 06:14