我有一个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
答案 0 :(得分:1)
您可以使用AJAX,我们假设您会在ready
和page:change
上显示评论,以避免出现Turbolinks问题
注意:我会使用erb,因为我对haml感到不舒服。
为您的AJAX事件创建路线,在这种情况下,我们将创建一个GET。
#This route will call the action get_one_comment of your articles_controller
get 'articles/get_one_comment'
在您的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响应。
我们的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>
现在我们需要创建一个Ajax请求来异步加载注释,我将使用CoffeeScript,在assets/javascripts
文件夹中选择一个文件,让我们说我们选择{{1}因此,当页面加载时,我们将遍历所有文章并发送Ajax请求:
articles.js.coffee
创建一个响应脚本,在这种情况下,我们在我们将要在#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,例如在不同的事件中发送请求,如滚动,悬停,点击等...