Ruby on Rails使用Ajax进行渲染
我正在开发一个简单的网站,其中有歌曲forms的post,现在我已经实现了喜欢和不喜欢的function,但是当我点击喜欢/不喜欢它时会在所有post上呈现喜欢/不喜欢的数量。 当我重新加载页面时,它将恢复正常。 现在我希望它只更改该特定post的数字,而不影响其他post的数字?
我对post的看法:
"50x50" %> <a href="https://stackoverflow.com/user/" class="info-col"> - <a href="https://stackoverflow.com/questions/48284898/ruby-on-rails-on-rendering-with-ajax/" class="link-col">
song_like部分具有以下代码:
 
song_dislike部分具有以下代码:
 
我的’喜欢’控制器就像:
def like @s = Song.find(params[:id]) @like = Like.create(like: params[:like], user: current_user, song: @s) respond_to do |format| if @like.valid? format.html format.js else format.html format.js end end
结束
这就是like.js.erb的样子:
$('.songlikes').html(""); $('.songdislikes').html("");
这是routes.rb文件的一部分:
resources :songs do member do post 'like' end end
我假设渲染或jquery存在一些问题,但无法弄明白。 你有任何指示吗?
编辑:您应该删除f.html中的redirect_to?
这会重新加载页面 – 因此js将无法正常工作。
根据定义,Ajax调用不会重新加载页面。
如果删除这些行并尝试以下操作:
你的jQuery中没有新数据。
您需要一个全局属性,因此视图可以从控制器中查找数据。
例如:
@like = ...
然后在您的视图中,您可以添加要渲染的本地:
$("#song_like").load("<%=j render partial: '/components/song_like', locals: {like: @like} %>");
但是 ,你需要将你的部分改为部分。 并将变量更改为like
以便以正确的方式呈现。
希望能帮助到你!
UPDATE
如果您想要播放特定歌曲,可以使用each
歌曲进行渲染,然后为您的post类分配一个ID
例如:
<% @posts.each do |post| %> ... other stuff ... .. number of likes <%= link_to "Like", link_route_path(post) %> <% end %> # controller # So you can use the id in your js view @id = params[:id] # view.js $(".like-post-" + "<%= @id %>").html("<%= @s.thumbs_up_total %>");
希望这个想法有所帮助
像这样改变渲染:
<%= render partial: '/components/song_like', locals: {s: @s, like: true} %>
部分:
<%= link_to like_song_path(s.id, like: like), method: :post, remote: true do %>   <%= s.thumbs_up_total %> <% end %>
并且在like_song的控制器中
应该定义
@s= Song.find(params[:id]) like = Like.create(like: params[:like], user: current_user, song: @song) @like = !like.like # opposite to your current status
其余的事情好,然后在like.js.erb
$('#songs_like').html("<%= escape_javascript(render partial: '/components/song_like', locals: { s: @s, like: @like } ) %>")