Rails Erb 文件里,我将<% %>写入了 Javascript 的 function 里,为什么仍旧被执行?

gellerseu · 2014年04月04日 · 最后由 weichen0 回复于 2014年05月01日 · 3803 次阅读

事情是这个样子。我有一个 Contract model,里面有个 status 我在一个 erb 文件中,写入

<script>


function post_approve()
{
    x = document.getElementById("approve");
    x.innerHTML="<% @post.update_attribute( :status , 3) %>";
    window.location.reload();
}
function post_approve()
{
    x = document.getElementById("reject");
    x.innerHTML="<% @post.update_attribute( :status , 4) %>";
    window.location.reload();
}
</script>

    <button type="button" class="btn btn-primary" onclick= "post_approve()">审批通过</button>
    <button type="button" class="btn btn-primary" onclick= "post_reject()">拒绝通过</button>

<div id="reject"></div>
<div id="approve"></div>

当我,在浏览器中载入时,我什么都还没有做,status 的值就被设置成了 4.当我删掉 function post_approve() 这个函数之后,加载页面时,status 就被直接复制成了 3. 从现象上看,就是,程序直接执行了<% %>里面的内容。 问题 1. 是不是 ERB 文件一定会按顺序执行所有的<%%>里面的 ruby 代码?【即使,是在一个 JS function 里面的】 问题 2.我该怎么实现,我想要的功能。点击一个按钮,程序会执行一段 ruby 代码,对一个 model 进行修改。

两个函数都是 post_approve,笔误?

好吧。认真回答。http server 在传送页面时是按照顺序来解析的,当遇到<% %>时就把里面的信息传给 rails 让 rails 执行再把结果输出,所以当然就被执行了。

要点按钮之后执行 ruby 代码,你要用 POST 而不是 GET。

这是多么基础的问题,楼主要搞清楚哪些东西是在服务器上执行的,哪些能在浏览器上执行的

erb 类似于 jsp,用来动态产生 HTML 的,里面的<% %>标签在服务器上就被执行了,返回给浏览器是执行完了的 HTML 结果

你要执行点击一个按钮去执行一个 ruby 代码,这个时候需要发出一个请求到服务器,要么提交表单,要么用 AJAX 方式发一个请求

ERB 只是一个模板渲染器,它会将 <%= %> 中的 Ruby 代码执行后返回的字符串替代整个<%= %>,例如:

<% user_name = "基础啊!" %>
<p>注意,<%= use_name %></p>

输出结果为

<p>注意,基础啊!</p>

渲染模板完毕之后,Rails 就会按照 HTTP 协议,返回模板里的内容给浏览器,然后浏览器就会解析并显示出来。

@AlphaLiu 你没发现楼主根本就没搞明白什么是 web 么,根本就没明白浏览器是怎么跟 Rails 交互的么?

erb 在服务端渲染。。。。

#1 楼 @AlphaLiu 感谢回答。我最近刚开始写 Web 程序,很多基础知识都不懂。我现在改为通过 controller 来做操作 status。至少实现了部分目的。之后会作其他尝试。

#2 楼 @miclle 感谢回答【叫我小白好了】

#2 楼 @miclle 关于 Ajax 的使用我还是不太明白。。。。。

#8 楼 @gellerseu 我也不太明白你哪不明白。是哪些问题呢?

前面加 escape_javascript

#10 楼 @karmue 这样的话,在按下按钮后,Ruby 代码会执行么?

我只写知道为什么*.js.haml 没什么效果??

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