新手问题 render 怎么传递参数? 怎样重新刷新一小部分页面?

chairy11 · March 27, 2014 · Last by chairy11 replied at March 28, 2014 · 6554 hits

问题一:render partial 怎么传递变量?

<% products.each do |product| %>
    <article >
      <header>
        <% if user_signed_in? %>
            <% if current_user.liked_products.include? product %>
                <%= link_to "已喜欢", unlike_product_path(product), method: :delete, remote: true %>
            <% else %>
                <%= link_to "喜欢", like_product_path(product), method: :post, remote:true %>
            <% end %>
        <% end %>
      </header>
    </article>
<% end %>

其实本来很想把关注按钮部分提取出去,改成如下版本:

  1. 原文件:
<% products.each do |product| %>
    <article >
      <header>
        <%= render '_follow_icon',   locals: {product: product}      if user_signed_in? %>
      </header>
    </article>
<% end %>
  1. _follow_icon.html.erb:
<% if current_user.liked_products.include? product %>
    <%= link_to "已喜欢",  unlike_product_path(product), method: :delete, remote: true %>
<% else %>
    <%= link_to "喜欢", like_product_path(product), method: :post, remote:true %>
<% end %>

但问题在于貌似怎么都无法把变量传递过去。怎么办?

注:这代码之前还有另一层嵌套,所以没有直接

<%= render product %>  

问题二:怎样重新刷新一小部分页面?

用了 remote:true, 点击完关注按钮后,在 controller 处理完的,我希望_follow_icon.html.erb 部分再刷新一下就行了,不另外写 js, 可以吗?因为_follow_icon.html.erb 自己会先判断一下应该是 link_to"已喜欢"还是"喜欢".

<%= render 'follow_icon', product: product %>
<%= render partial: 'follow_icon', locals: { product: product } %>

#1 楼 @Rei 谢谢,之前我用过

<%= render 'follow_icon',   locals: {product: product}      if user_signed_in? %>

一直报错,这次用

<%= render 'follow_icon',   product: product     if user_signed_in? %>

貌似成功了。

#1 楼 @Rei 问题二呢,能帮我想想吗?貌似正常的话要写 js 的吧?有没有直接让这个_follow_icon.html.erb 在原区域刷新一下的方法?因为它本身就会该用哪个按钮...

follow.js.erb

$('#id').replaceWith('<%= j render('follow_icon') %>')

这样就 ok 了

#4 楼 @saiga 不知道是不是因为缓存?反正点击了没效果,而且貌似我要写一个 follow.js.erb,写一个 unfollow.js.erb, 那要不我还是直接插入 html 句子好了...

#4 楼 @saiga 貌似也不行... 我现在是先取消了 remote:true , 暂时用 redirect_to :back 让它刷新页面...

#3 楼 @chairy11 There is no magic

指到同一个模板就可以了,也可以用 toggle_follow 这种写法。 无效的话看看 response 的 js 是不是正确的,能选到正确的元素么?

#5 楼 @chairy11 @saiga 的意思是这样的

<div id="id">
  <%= render '' %>
</div>

$('#id').replaceWith('<%= j render('follow_icon') %>') 把你的 render 放在一个 id 叫"id"的 div 面面,然后就可以不用刷新页面了就能解决你的第二个问题了

#6 楼 @chairy11 就是 4 楼方法。

提问三件套:

  1. 代码
  2. 日志
  3. 调试

#8 楼 @saiga #10 楼 @Rei 还是没搞定。脑子好乱。

  • 我的 follow 动作在 product_controller 下面,但好几个页面都用到,(有些不是对应 product 的页面).
  • 从功能实现来看,都是建立 user_product 的关系,但从外观上看,按钮的外形不一样 (有些带 text 有些不带 text, CSS 中的 class 也不一样), 所以貌似单纯 follow.js.erb 搞不定。
  • 另外,不知道为什么,remote: true 的效果一直出不来,就是说页面不刷新了,但也没有出现更新后的结果,搞不懂...

#12 楼 @chairy11 用 json,写客户端 js。

#13 楼 @Rei 简直要哭了...要不我还是先干别的吧...

You need to Sign in before reply, if you don't have an account, please Sign up first.