遇到一个 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' %>
这几个文本,当然肯定是我这个方法不对。
在某个 slim 页面写
<script type="text/javascript">
function getCategory() {
return "<%=j render 'categories/category' %>";
}
</script>
然后 replaceWith 调用这个叫做 getCategory 的方法应该能替换成功
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' %>");
#8 楼 @Rei #9 楼 @1272729223 在用 slim 的时候就是 js 很麻烦,所有很多时候我用的 render ~~~这个是不是很不专业啊
#16 楼 @Rei 抱歉,自己找到了解决办法,就是把 javascript: 换成 pipe 就行了。。。rails 对 slim 支持还是不是很完善。下面是详细答案:http://stackoverflow.com/questions/18772210/how-to-make-ajax-answer-for-slim