0

我有一个rails应用,它由上面的导航、主要内容和侧边菜单三个部分构成。

我已经在我的主要内容中实现了关注取消关注按钮。
到目前为止,它与 Ajax 完美配合。

基本上,如果我按下跟随按钮,将调用 users_controller.rb 中的跟随动作并更改跟随标志,然后调用 follow.js 将跟随按钮重新渲染为部分。
除此之外,在侧面菜单中,它有 current_user 关注的人数。
此数字也应在执行后续操作后立即刷新。

一次刷新 2 个以上的局部。我该如何存档?

控制器/users_controller.rb

....

  def follow
    @user = User.find(params[:id])
    current_user.follow(@user)
    respond_to do |format|
      format.js {render :action=>"follow.js"}
    end
  end

  def unfollow
    @user = User.find(params[:id])
    current_user.stop_following(@user)
    respond_to do |format|
      format.js {render :action=>"unfollow.js"}
    end
  end

...

意见/用户/follow.js.erb

$('.follow_user[data-user-id="<%=@user.id%>"]').html('<%= escape_javascript(render :partial => "users/follow_user", :locals => {:user => @user}) %>');

意见/用户/取消关注.js.erb

$('.follow_user[data-user-id="<%=@user.id%>"]').html('<%= escape_javascript(render :partial => "users/follow_user", :locals => {:user => @user}) %>');

视图/布局/_menu.html.erb

          <% if user_signed_in? %>
                  <li><%= link_to(following_user_path(current_user.username)) do %>
                  <i class="icon-heart"></i>Following
                  <%= '(' + current_user.all_following.count.to_s + ')' if current_user.all_following.count > 0 %>
                  <% end %>
                  </li>    

                  <li><%= link_to(followed_user_path(current_user.username)) do %>
                  <i class="icon-heart"></i>Followed by
                  <%= '(' + current_user.followers.count.to_s + ')' if current_user.followers.count > 0 %>
                  <% end %>
                  </li>
              <% else %>
                  <li><%= link_to sanitize('<i class="icon-heart"></i> ') + "Following", following_user_path %></li>                                            
                  <li><%= link_to sanitize('<i class="icon-heart"></i> ') + "Followed by", followed_user_path %></li>                                           

              <% end %>
4

3 回答 3

1

您可以创建一个新操作,render_to_string将这两个部分都格式化为 json 对象:

{
div_id_1: "<ul....." ,
div_id_2: "<div...."
}

于 2012-12-18T14:10:55.140 回答
1
# dedicate partial _following_number.html.erb
<span id="following_number">
  <% if user.followers.count > 0 %>
    <%= '(' + user.followers.count.to_s + ')' %>
  <% end %>
</span>


# update layout with partial:

<li><%= link_to(followed_user_path(current_user.username)) do %>
<i class="icon-heart"></i>Followed by
  <%= render :partial => "following_number", :user => current_user %>
<% end %>

# follow.js.erb && unfollow.js.erb:
...
$(document).find("#following_number").replaceWith('<%= escape_javascript(render("following_number", :user => @user, :formats => [:html])) %>')

使用助手更优雅:

def following_number(user)
  user.followers.count > 0 ? "(#{user.followers.count})" : nil
end

# then put spans to layout:
<span id="following_number"><%= following_number(current_user) %></span>

# and js:
$(document).find("#following_number").html('<%= escape_javascript(following_number(@user)) %>')
于 2012-12-18T14:44:25.107 回答
0

一种简单的方法是从 rails 返回 a.js并让您的视图执行此脚本,该脚本将具有更新/替换视图的操作。

例如,这只是呈现三个部分,然后使用 jQuery 替换视图中的内容。假设该操作是my_action这样的,您将在您的中放置以下代码my_action.js.erb

$("#content_1").html("<%= escape_javascript(render('partial_1'))%>");
$("#content_2").html("<%= escape_javascript(render('partial_2'))%>");
$("#content_3").html("<%= escape_javascript(render('partial_3'))%>");

此示例可以按照您想要或需要的方式进行扩展。您还可以为模型渲染 json 并调用函数在视图中更新它们。

于 2012-12-18T14:11:08.973 回答