如何在 ruby​​ on rails 中访问 rails 助手和嵌入资产 javascript 文件中的 ruby​​?

Posted

技术标签:

【中文标题】如何在 ruby​​ on rails 中访问 rails 助手和嵌入资产 javascript 文件中的 ruby​​?【英文标题】:How do I access rails helpers and embedded ruby inside assets javascript files in ruby on rails? 【发布时间】:2012-05-03 07:49:46 【问题描述】:

我有一个显示和隐藏 div,单击时显示和隐藏 cmets。默认情况下,在单击之前,它会显示消息计数以及一些向下箭头,例如

“55 条评论 [向下箭头]”

点击后会变成:

“隐藏 cmets [向上箭头]”

我使用此代码默认显示 cmets 的数量和箭头(用户/新):

    <span class="commentsCount"><%= pluralize(m.comments.count, 'comment') %></span>
    <span class="commentArrows"><%= image_tag 'view_all_comments.png' %> </span>

我使用 JQuery 来帮助实现更改(users/load_cmets.js.erb):

$('.postHolder').off().on('ajax:success', '.view_all_comments', function()

    var postContent = $(this).parents('.post_content'),
        commentContainer = postContent.find('.comment_container'),
        getComments = "<%= j render 'users/partials/show_all_comments' %>";
        commentContainer.slice(0, -2).remove();

// The next 2 lines replace the comment count with "Hide comments" and up arrows"

          postContent.find('.commentsCount').html("Hide comments");
          postContent.find(".commentArrows img").prop("src", "/assets/up_arrows.png");

             postContent.find('.comment_container:first').before(getComments);
);

现在重要的部分是再次单击 Hide cmets 时。我需要它恢复显示 cmets 计数。我可以将箭头恢复为原始箭头,但文本我看不到恢复为 cmets 帐户的方法,因为我无法访问我的 assets/javascripts/users.js 文件中的 rails 助手和我的实例变量等。

这里是代码(assets/javascripts/users.js:

    // for showing and hiding comments

        $('.expandComments').click(function() 

        var showAllCommentsSubmit = $(this).find('.showAllCommentsSubmit'),
            postContent = $(this).parents('.post_content'),
            commentContainer = postContent.find('.comment_container');


            if ($(this).hasClass('visible')) 
                postContent.find(".comment_container").slice(0, -1).hide();
                postContent.find(".commentArrows img").prop("src", "/assets/view_all_comments.png");

//Here is where I need the code to replace the "Hide comments" text.

              else 


                if (showAllCommentsSubmit.is(':disabled')) 
                    postContent.find(".comment_container").show();
                    postContent.find(".commentArrows img").prop("src", "/assets/hide_comments.png");

                 else 
                    showAllCommentsSubmit.trigger('submit');
                    showAllCommentsSubmit.prop(disabled: true);
                    postContent.find(".commentArrows img").prop("src", "/assets/comments-loader.gif");
                
            

            $(this).toggleClass('visible');

        );

由于我认为无法在资产 javascript 文件中使用嵌入式 ruby​​ / rails 助手,我将如何实现我想要实现的目标。

有没有办法在其他 html 之上显示一些 html,然后在不再需要它时将其删除并再次显示下面的 html?

我确信我可以提出其他一些解决方案,例如将一些 css 发挥作用.. 有一个 div 隐藏和显示,但我还没有想出我会如何做到这一点。想知道是否有快速的解决方案。

【问题讨论】:

【参考方案1】:

您可以在资产代码中使用 Rails 助手。您基本上只需要将资产从 users.js 重命名为 users.js.erb,Rails 会在将内容作为 JavaScript 发出之前使用 ERb 对其进行预处理。

查看Rails guide on preprocessing in the asset pipeline了解详情。

【讨论】:

以上是关于如何在 ruby​​ on rails 中访问 rails 助手和嵌入资产 javascript 文件中的 ruby​​?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ruby​​ on rails 中更改路线?

Ruby on Rails:如何通过 ngrok 访问 Action Cable?

如何在本地网络上托管 Ruby on Rails 应用程序,以便多人可以访问它?

如何使用 NuoDB 在 Ruby On Rails 中手动执行 SQL 命令

如何在 Ruby on Rails 中分析请求?

如何从我的 Ruby on Rails API 解析这些散列转换为字符串,以便它可以作为 Javascript 中的对象进行访问?