Ruby如果条件在javascript文件中无法正常工作
控制器:
def AjaxView @vars= Var.find(:all,:conditions => { :varName=> "one" },:select=>(params[:col])) @col = params[:col] respond_to do |format| format.js { render :layout=>false } end end
AjaxView.js.erb
if('' == 'colName'){ $("#3").text(" "var")) %>"); } else if('' == 'colName2'){ $("#2").text(" "var1")) %>"); }
查看部分:
_var.html.erb
_var1.html.erb
如果我更改此代码
$("#3").text(" "var") %>");
提醒(“hi_one”); 和
$("#2").text(" "var1") %>");
提醒(“hi_two”);
它工作正常。
但是当我把上面的代码放在一起时,它每次都运行代码,不知道为什么,是编译它还是什么? 什么出路?
渲染输出:
渲染测试/ _var.html.erb(16.0ms)渲染测试/ AjaxView.js.erb(19.0ms)在38ms内完成500内部服务器错误
ActionView :: Template :: Error(缺少属性:colName):1:
Firebug中的Javascripty输出是500错误
目前您的条件if('<%= @col %>' == 'colName')
是客户端 JavaScript。
这意味着什么
if('<%= @col %>' == 'colName'){ $("#3").text("<%= escape_javascript(render(:partial => "var")) %>"); } else if('<%= @col %>' == 'colName2'){ $("#2").text("<%= escape_javascript(render(:partial => "var1")) %>"); }
render :partial
调用在服务器端执行,以便Rails呈现模板,但是当生成的JavaScript执行客户端时,逻辑确定执行哪个.text
调用。 这意味着两个部分的内容必须在两个场景中都有效(即使是最终不会被使用的场景)。
要解决此问题, colName2
在您的:select
包含colName
和colName2
,或者将if
更改为服务器端,以便您只回复一个.text
行。 例如
<% if @col == 'colName' %> $("#3").text("<%= escape_javascript(render(:partial => "var")) %>"); <% elsif @col == 'colName2' %> $("#2").text("<%= escape_javascript(render(:partial => "var1")) %>"); <% end %>