Rails 4 Ajax 之类的按钮无法正常工作

Posted

技术标签:

【中文标题】Rails 4 Ajax 之类的按钮无法正常工作【英文标题】:Rails 4 Ajax like button failing to wоrk 【发布时间】:2016-01-14 09:45:36 【问题描述】:

我正在努力使我的 Like 链接与 ajax 一起使用。点击“Like”后没有任何变化,只有在刷新页面后我才能看到点赞数已计入。

编辑:Addet 路线。 EDIT2:我用 Firebug 检查了 Like 链接,从 like.js.erb 文件输入代码后,它显示消息: Image 我的 like.js.erb 文件:

        <% if Like.find_by(likeable: @post) %>
          $(".likes").html("<%= escape_javascript(render 'posts/unlike' ) %>");
        <% else %>
          $(".likes").html("<%= escape_javascript(render 'posts/like' ) %>");
        <% end %>

(我已经检查过,如果条件正常)。 我的部分帖子(_post.html.erb)。

    <li class="post">
        <span class="user"><%= link_to post.user.name, post.user %></span>
        <br>
        <span class="title"><%= post.title %></span>
        <br>
        <span class="ava"><%= image_tag post.avatar(:large) %></span>
        <br>
        <span class="timestamp">
            Posted <%= time_ago_in_words(post.created_at) %> ago.
            <% if logged_in? && current_user.admin? %>
                <%= link_to "delete", post, method: :delete,
                                                                        data:  confirm: "You sure?"  %>
            <% end %>
################## START OF THE LIKES #####################
            <span class="likes">
                <span class="like">
                <% if logged_in? %>
                    <% if !current_user.likes?(current_user, post) %>
                        <%= render 'posts/like', post: post %>
                        <!-- <%= link_to "Like", like_post_path(post, like: true), method: 'post', remote: true %> -->
                    </span>
                    <% else %>
                    <span class="unlike">
                        <%= render 'posts/unlike', post: post %>
                        <!-- <%= link_to "Unlike", like_post_path(post, like: false), method: 'post', remote: true %>-->
                    </span>
                    <% end %>
                    (<%= pluralize( post.likes.size, "like") %>)
                <% else %>
                    <%= link_to "Like", login_path,
                          data:  confirm: "You need to log in to like"  %>
                    (<%= pluralize( post.likes.size, "like") %>)
                <% end %>
            </span>
################## THE END OF THE LIKES #####################
        </span>
    </li>

post 控制器中的类似方法。

def like
    post = Post.find(params[:id])
    if Like.find_by(likeable: post)
        Like.find_by(likeable: post).destroy
        respond_to do |format|
            format.html do
                flash[:success] = "Like Updated!"
                redirect_to :back
            end
            format.js
            end
    else
        Like.create(likeable: post, user: current_user, like: params[:like])
        respond_to do |format|
            format.html do
                flash[:success] = "Like Updated!"
                redirect_to :back
            end
            format.js
        end
    end
end

我使用的喜欢和不同的部分: 喜欢:

<%= link_to "Like", like_post_path(post, like: true), method: 'post', remote: true %>

不同于:

<%= link_to "Like", like_post_path(post, like: false), method: 'post', remote: true %>

任何帮助或建议都会很好。我知道我的代码状况不佳,所以不要害怕提出一些更改建议。最后请帮助我,我已经浪费了大量时间试图让它工作,但还没有结果。

路线:

Rails.application.routes.draw do
    root 'main_page#home'
    get         'top_list'  => 'main_page#top_list'
    get         'sign_up'   => 'users#new'
    get         'posts/new'
    get         'login'         => 'sessions#new'
    post        'login'         => 'sessions#create'
    delete  'logout'        => 'sessions#destroy'
    resources :users
    resources :posts do
        member do
            post 'like'
        end
    end
end

点赞后有日志。

Completed 500 Internal Server Error in 66ms (ActiveRecord: 41.0ms)

NameError (undefined local variable or method `post' for #<#<Class:0x007f8ce976ff48>:0x007f8ce976f3e0>):
  app/views/posts/_unlike.html.erb:1:in `_app_views_posts__unlike_html_erb___187529012528174235_70121703666860'
  app/views/posts/like.js.erb:4:in `_app_views_posts_like_js_erb__3375438513772599537_70121703368540'
  app/controllers/posts_controller.rb:38:in `like'

【问题讨论】:

你也会添加你的路线吗?奇怪的是 like.js.erb 没有编译 erb。尝试在该模板中添加&lt;% raise %&gt;,看看是否可以提高它。此外,如果您还没有尝试过 - better_errors gem 是帮助调试的好方法 一个注释 - 我检查并在更改后 $(".likes").html("");到 $(".likes").html("foobar");它实际上通常会更改为 foobar 所以我不确定这个错误是否是问题的根源。是的 - 添加 到喜欢和不同的部分都会引发错误。另一方面,将它添加到 js.erb 文件不会引发 - 但我不确定它是否应该。 另外,better_errors gem 什么也不显示 - 它不会引发任何错误。 您应该会在 js.erb 文件中看到带有 raise 的错误(至少在日志中)。 好吧,我现在很糟糕,因为我没有想到这一点。我编辑了上面的问题并添加了日志。看起来部分没有看到变量,但我不明白为什么 - 我通过它 。有什么建议吗? 【参考方案1】:

尝试在末尾添加html_safe。另外,我认为渲染也需要post(就像你在视图中所做的那样)

$(".likes").html('<%= escape_javascript(render "posts/unlike",post: @post).html_safe %>');

http://apidock.com/rails/String/html_safe

【讨论】:

试过了,遗憾的是它没有解决问题,但我真的很感谢你的时间和帮助。 嗯,您也尝试过使用raw 吗?并将" 替换为'? 嗯,我需要清理控制器中的一些混乱并使用您的建议。非常感谢!

以上是关于Rails 4 Ajax 之类的按钮无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

DataTable clearFilter() 无法正常工作

内联 Javascript 在 Rails 3.1 上重新渲染部分 ruby​​ 时无法正常工作

无法在 Rails 5 中将 Json 数据获取到 Ajax

使用 rails 4 认证的根路由进行设计无法正常工作

按两个鼠标按钮无法正常工作

adminLTE 2.4.5树视图在刷新后无法正常工作,只有它在rails中工作