【问题标题】:Why is my partial not rails rendering properly?为什么我的部分不是 rails 渲染正确?
【发布时间】:2016-04-09 20:39:54
【问题描述】:

我想添加 cmets 而无需在我的应用中刷新页面。但是,我的部分没有正确加载我正在实现的 JS 功能。

我的日志或控制台中没有任何错误,并且在我刷新页面后会显示评论,但如果不刷新就不会发生。

另外,当我只是编写 JS 将最后一条评论附加到 win_com id 时,代码可以工作。我希望 HTML 通过 JS 动态显示部分评论的当前状态,而不仅仅是附加最后一条评论。任何帮助,将不胜感激!这是我的代码:

cmets_controller.rb:

def create
    @window = Window.find(params[:window_id])
    @comment = @window.comments.build(comment_params)
    @comment.user_id = current_user.id

    if @comment.save
        respond_to do |format|
            format.html { redirect_to post_path(@post) }
            format.js 
        end
    end
end

views/windows/show.html.erb:(大图的一部分)

<div class="row col-md-7" id="win_com">
    <h4>User Comments</h4>
    <%= render partial: '/windows/comment', collection: @comments %>
</div>

views/windows/_comment.html.erb:

<div class="container">
    <div class="row col-md-7">
        <p><%= comment.body %></p> 
        <p><%= link_to "Delete", [comment.window, comment], method: :delete,
                                                            data: {confirm: "Are you sure?"} %></p>
    </div>
</div>

views/cmets/create.js.erb:

$('#win_com').html("<%= j render(partial:'/windows/comment', collection: @comments)%>");

application.js:

//= require jquery
//= require jquery_ujs
//= require bootstrap-sprockets
//= require turbolinks
//= require_tree .

也许是我的服务器日志中的一些关键行?:

Rendered windows/_comment.html.erb (0.0ms)
Rendered comments/create.js.erb (1.8ms)

【问题讨论】:

  • 浏览器有时会在 JS 响应中出现字符串标记。如果使用 Chrome 打开您的终端,请转到网络选项卡并创建您的评论。您将看到返回的是什么服务器以及浏览器是否遇到了问题。
  • $('#win_com').html"";这是我得到的回应,但我不知道该怎么做?
  • 尝试这样调用它: $('#win_com').html("");
  • 谢谢,我刚刚意识到我忘记了括号,但是,现在所有以前的 cmets 都消失了,并且在我刷新之前 cmets 部分没有任何显示。我在网络选项卡中得到了类似的响应:$('#win_com').html("");
  • html 函数会将#win_com 的内容设置为空白(因为没有作为参数传递)。您可能必须使用“附加”功能。

标签: javascript ruby-on-rails ruby ajax partials


【解决方案1】:

.html() 将替换目标 DOM 元素的所有内容,而不是使用 .append()

替换这个:

$('#win_com').html( "<%= j(render(partial:'/windows/comment', collection: @comments)) %>" );

这样:

$('#win_com').append( "<%= j(render(partial:'/windows/comment', collection: @comments)) %>" );

【讨论】:

    【解决方案2】:

    您在控制器操作创建中缺少@cmets 实例变量。 Rails 不能神奇地知道它是什么,除非你指定它。您可以将您的创建操作更改为类似的内容。

    def create
        @window = Window.find(params[:window_id])
        @comment = @window.comments.build(comment_params)
        @comment.user_id = current_user.id
    
        if @comment.save
            @comments = @post.comments //given that this is defined. 
            respond_to do |format|
                format.html { redirect_to post_path(@post) }
                format.js 
            end
        end
    end
    

    【讨论】:

    • 是的,我刚刚从用户不久前离开的一些 cmets 中发现了这一点。感谢您回复我,我很感激。
    猜你喜欢
    • 1970-01-01
    • 2014-01-23
    • 1970-01-01
    • 2019-09-30
    • 2011-12-17
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    • 2016-08-30
    相关资源
    最近更新 更多