【问题标题】:Using ajax to render partial使用ajax渲染部分
【发布时间】:2014-02-16 18:44:24
【问题描述】:

在我的 Rails 应用程序中,我有一个模型 Song。在用户的个人资料页面user_music_path(@user) 上,我正在渲染他们所有的歌曲。

人们也可以喜欢这些歌曲,它是设置和工作的,我只想使用 AJAX 而不是页面刷新。我遇到的问题是在使用 ajax 时,单击“like”链接时出现错误 undefined local variable or method "song"

这是我的一些代码:

用户的音乐页面浏览量/users/music.html.erb

...
<ul class="playlist list-group">
  <%= render @songs %>
</ul>

views/songs/_song.html.erb

<li class="list-group-item">
  <p class="pull-right">
    <%= render :partial => 'songs/like_button', :locals => {:song => song} %>
    <%= render :partial => 'songs/likes', :locals => {:song => song} %>
  </p>
</li>

views/songs/_like_button.html.erb

<% if current_user.voted_on?(song) %>
  <%= link_to "Unlike", unlike_song_path(song), :method => :post, :remote => true %>
<% else %>
  <%= link_to "Like", like_song_path(song), :method => :post, :remote => true %>
<% end %>

views/songs/_likes.html.erb

<%= song.votes.count %>

views/songs/like.js.coffee

$("p.pull-right").html('<%= render :partial => "songs/like_button", :locals => {:song => song} %><%= render :partial => "songs/likes", :locals => {:song => song} %>');

controllers/songs_controller.rb

def like
  begin
    @vote = current_user.vote_for(@song = Song.find(params[:id]))
    @vote.save
    respond_with @song.user, :location => user_music_path(@song.user)
  rescue ActiveRecord::RecordInvalid
    redirect_to @song
  end
end

如前所述,在我开始使用 AJAX 之前,:like 操作非常有效。我还添加了respond_to :html, :js 到我的songs_controller。当我尝试喜欢这首歌时,我得到的错误是ActionView::Template::Error (undefined local variable or method "song" for #&lt;#&lt;Class:0x000001028de9d0&gt;:0x00000106ecd9f0&gt;):

【问题讨论】:

    标签: ruby-on-rails ajax ruby-on-rails-4 coffeescript


    【解决方案1】:

    你在哪里

    <a href="<%= song.audio %>"><%= song.name %></a>
    

    试试吧

    <a href="<%= @song.audio %>"><%= @song.name %></a>
    

    对您的 link_to 路径和您的 render 调用执行相同的操作。

    【讨论】:

    • 因为我使用的是部分“_song.html.erb”,所以我在 Song 类的歌曲变量上调用渲染,因此我仍然可以使用局部变量 song 而不是@song
    • 只要你这样做:{:song =&gt; @song}
    • 如果我这样做,当我尝试点赞一首歌曲时,它会更改该页面上每首歌曲的点赞按钮。
    【解决方案2】:

    rake routes 并将它们用于链接,例如(伪代码)link_to 'song', song_audio_path

    【讨论】:

    • 这不是这里的问题。问题不在于歌曲音频的链接,问题在于当歌曲被喜欢/不喜欢时,使用局部变量 song 渲染正确的部分。