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

chairy11 · 2014年03月27日 · 最后由 chairy11 回复于 2014年03月28日 · 5223 次阅读

问题一: 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 简直要哭了...要不我还是先干别的吧...

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册