如何在rails视图中使用AJAX

时间:2016-03-10 15:38:46

标签: javascript ruby-on-rails view

我有一个articles循环,每个循环都有一个 comment

目标是使用JS动态/异步地呈现一个comment

我的问题是:

如何调用/激活我在下面定义的逻辑?

#welcome/index.haml
- @articles.each do |article|
  = article.title
  - article.comments.each do |comment|
    %comment-content{ :id => "comment-#{comment.id}" }

#welcome/comment.js.erb
// var
var comment = "#comment-<%= params[:comment_id] %>" 

// render
$(comment).html("<%=j render 'comment_content' %>")

#welcome/_comment_content.haml
= comment.content

更新:

在尝试解决问题时,我想我应该添加如下内容:

class WelcomeController < ApplicationController 
    def index
    end

    def comment
        respond_to do |format|
            format.js { render 'comment' } 
    end 
end

1 个答案:

答案 0 :(得分:1)

您可以使用AJAX,我们假设您会在readypage:change上显示评论,以避免出现Turbolinks问题

注意:我会使用erb,因为我对haml感到不舒服。

第1步:定义路线

为您的AJAX事件创建路线,在这种情况下,我们将创建一个GET。

#This route will call the action get_one_comment of your articles_controller
get 'articles/get_one_comment'

第2步:定义控制器操作

在您的articles_controller.rb中创建get_one_comment操作,因此当您的ajax调用该操作时,它会检索正确的信息,从您的Ajax操作中您将发送文章的ID,因此它将可用如params[:article_id],还要确保操作与控制器回调兼容,有时控制器中的before_action可能会导致问题:

#articles_controller
def get_one_comment
  @article = Article.find params[:article_id]
  @comment = @article.comments.last
  resond_to do |format|
    format.js
  end
end
你注意到respond_to阻止了吗?以及您可以看到此控制器操作将以js.erb格式或js.haml响应。

第3步:修复标记

我们的Ajax请求中的想法是遍历我们的文章并将文章id发送到控制器操作,我们还需要设置某种css类或id,我们的响应脚本将放置注释。

#welcome/index.html.erb
<% @articles.each do |article| %>
<div id="article-<%= article.id %>" class="article-block" data-article-id="<%= article.id %>"
<%= article.title %>
<div class="comment-section">
</div>
</div>

第4步:添加Ajax

现在我们需要创建一个Ajax请求来异步加载注释,我将使用CoffeeScript,在assets/javascripts文件夹中选择一个文件,让我们说我们选择{{1}因此,当页面加载时,我们将遍历所有文章并发送Ajax请求:

articles.js.coffee

步骤5:使用响应脚本呈现注释。

创建一个响应脚本,在这种情况下,我们在我们将要在#articles.js.coffee loadOneComment = -> $('.article-block').each -> $article_block = $(@) $.ajax '/articles/get_one_comment', type: 'GET' dataType: 'script' data: { article_id: $article_block.data('article-id') } error: (jqXHR, textStatus, errorThrown) -> console.log("AJAX Error: #{textStatus}") success: (data, textStatus, jqXHR) -> console.log("Worked OK!") $(document).ready loadOneComment $(document).on 'page:change', loadOneComment 中回答的控制器操作中设置,然后我们需要创建一个format.js文件,该文件将包含我们的响应脚本。在此脚本中,我们只需将评论恰当地放在页面中。

get_one_comment.js.erb

以上内容会为您网页中的每篇文章div呈现部分#get_one_comment.js.erb $('#article-<%= @article.id %> .comment-section').append('j render(@comment)');

如果它不起作用,请检查您的JavaScript控制台,我没有经过测试,所以我可能会输入错误,或者是rails控制台,但基本上我给了您实现它的步骤和正确的方法,您可以自定义您的AJAX,例如在不同的事件中发送请求,如滚动,悬停,点击等...