从Rails控制器执行Javascript功能(无需渲染或重新加载视图)

Execute Javascript function from Rails controller (without rendering or reloading the view)

是否可以从控制器执行application.js或相应的js.coffee文件中包含的Javascript函数,而无需呈现或重新加载视图? IE。只是一个简单的

1
2
3
4
def connect()
  call js:"connect_through_javascript();"
  render :nothing => true
end

但是除了呈现:nothing之外,还有什么方法可以使视图保持不变?
也可以使用它发送参数,即

1
2
3
4
def connect(param1, param2, param3)
  call js:"connect_through_javascript(#{param1}, #{param2}, #{param3});"
  render :nothing => true
end

被调用的Javascript函数将转到其回调的另一个控制器动作。

我将尝试使用Paloma gem,但我只是想知道在不添加依赖项的情况下是否有可能实现。


您想要的是AJAX。如果使用JavaScript库(如jQuery),或者如果readyState为4,并且如果使用本机JavaScript,则状态为200,则JavaScript将必须对成功回调中的HTTP响应主体进行智能化处理。

您陷入了HTTP请求-响应生命周期中。

编辑:这是一个简单的示例:

HTML

1
2
3
4
5
6
7
8
9
10
11
12
<script type="text/javascript">
    var xhr = new XMLHttpRequest();

    xhr.onreadystatechange = function() {
        if (this.readyState === 4 && this.status === 200) {
            document.getElementById("comments").innerHTML = this.responseText;
        }
    };

    xhr.open("GET","/posts/123/comments_ajax");

    xhr.send(null);

Rails控制器

1
2
3
4
5
6
7
class PostsController < ApplicationController

    def comments_ajax
        @comments = Comment.where(:post_id => params[:id])
    end

end

app/views/posts/comments_ajax.html.erb

的内容

1
2
3
4
5
6
7
<%= @comments.each |comment| do %>
   
<li>
<%= comment.text %>
</li>

<% end %>