新手问题 ajax 问题

1272729223 · 2013年04月22日 · 最后由 Rei 回复于 2014年04月06日 · 3384 次阅读

遇到一个 ajax 的问题,

shared/_navbar.html.slim

== content_for :javascript do
  $(function(){
    $(".nav a[data-remote]").click
       (function(){
         $(".info").replaceWith("<%=j render 'categories/category' %>"); 
       }
    );
  });
  .nav
    - @categories.each do |category|
      li = link_to category.name, category, :remote => true

html 省略了头部和底部

...
.container
  == render "shared/navbar"
  .main
    p.info Hello.
....

categories/_category.html.slim

h2.title = @category.name
.albums
  - @category.albums.each do |album|
    = link_to album.title, album

我想要的效果是导航点击之后 .main 标签里面替换成 _category.html.slim

现在实际的结果总是返回<%=j render 'categories/category' %> 这几个文本,当然肯定是我这个方法不对。

content_for :javascript 这个 block 里面的内容是在浏览器执行的,你看一看页面输出的源码,然后想象一下浏览器怎么解析这段 js。

#1 楼 @Rei 很抱歉,貌似我理解你的意思了。不过不知道是否是<%=j render 'categories/category' %>的问题。还是不知道怎么弄。

在某个 slim 页面写

<script type="text/javascript">
  function getCategory() {
    return "<%=j render 'categories/category' %>";
  }
</script>

然后 replaceWith 调用这个叫做 getCategory 的方法应该能替换成功

#2 楼 @1272729223

1 不知道你布局里的 yield :javascript 是怎么写的?我理解的内嵌 js 要这样写:

javascript:
   alert();

顶楼的代码在我这报语法错误。

2 slim 不使用 <%= %> 来插入 Ruby 代码,所以 <%=j render 'categories/category' %> 这段根本不解析。

如果用我在 1 的方式内嵌 js,那么调用 Ruby 代码应该像给 String 插值一样

javascript:
   alert( '#{ "Ruby String"}');

3 即使上面两条都做对了,这个做法也是错的。如果用内嵌 js,那么 j render 'categories/category 这一段的输出就直接写到内嵌 js 代码里了,跟 Ajax 无关。

如果你用 ujs 提供的 remote 方法进行 ajax,那么把逻辑写到请求响应的 view 里面。

# your controller

def your_action
  respond_to do |format|
    format.js
  end
end
<!- your_action.js.erb -->
$(".info").replaceWith("<%=j render 'categories/category' %>");

#4 楼 @Rei 谢谢 我已经解决了,原来是这样,折腾了半天。

就是少了一个 show.js.erb show.js.slim貌似不可以。

show.js.erb

$('.info').replaceWith('<%=j render "categories/category" %>');

#4 楼 @Rei 不过就是你 1 楼说的那个原理

#5 楼 @1272729223 slim 设计用来生成 html,不适合生成 js,所以这时用 erb 比较好。

#8 楼 @Rei #9 楼 @1272729223 在用 slim 的时候就是 js 很麻烦,所有很多时候我用的 render ~~~这个是不是很不专业啊

#12 楼 @Rei 就是在 slim 文件中 render 一个 erb 文件~~~,主要有时 slim 老是写着报错~~

#13 楼 @small_fish__ 减少内嵌 js 的状况,抽到 js 文件里面,我现在一点内嵌 js 都不用。

#14 楼 @Rei 不用内嵌怎样实现 ajax?返回的数据怎么办?用 json?那样的话分页控件怎么弄?

#16 楼 @Rei 你的意思是用 js.erb 对吧?我以为你说这种方式也算内嵌呢。理解错了。但是这种方式有个问题我也是最近才发现,当你不用 erb 模板而用 slim 的时候 js.slim 是不会被执行的不知到为什么。

#16 楼 @Rei 抱歉,自己找到了解决办法,就是把 javascript: 换成 pipe 就行了。。。rails 对 slim 支持还是不是很完善。下面是详细答案:http://stackoverflow.com/questions/18772210/how-to-make-ajax-answer-for-slim

#17 楼 @wudixiaotie slim 不是用来生成 js 的。

#19 楼 @Rei 你的意思是 js 都用 erb 么?

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