Ruby, если условие не работает должным образом в файле JavaScript - PullRequest
2 голосов
/ 03 января 2012

Контроллер:

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('<%= @col %>' == 'colName'){
    $("#3").text("<%= escape_javascript(render(:partial => "var")) %>");
  } else if('<%= @col %>' == 'colName2'){
    $("#2").text("<%= escape_javascript(render(:partial => "var1")) %>");
  }

Просмотр частично:

_var.html.erb

 <%= @vars[0].colName %>

_var1.html.erb

  <%= @vars[0].colName2 %>

Если я изменю этот код

$("#3").text("<%= escape_javascript(render(:partial => "var") %>"); 

на alert ("hi_one"); и

$("#2").text("<%= escape_javascript(render(:partial => "var1") %>");

до alert ("hi_two");

работает нормально.

но когда я ставлю вышеуказанный код, он запускает оба кода каждый раз, а неконечно, почему, он компилируется или как?и какой выход?

Вывод рендеринга:

Рендеринг test / _var.html.erb (16,0 мс)в 38 мс

ActionView :: Template :: Error (отсутствует атрибут: colName): 1: <% = @ vars [0] .col%>

Вывод Javascripty в Firebug составляет 500 ошибок

1 Ответ

4 голосов
/ 03 января 2012

В настоящее время ваше состояние 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 будет выполнен.Это означает, что содержимое обеих частей должно быть действительным в обоих сценариях (даже в том, который в конечном итоге не будет использоваться).

Чтобы исправить это, либо включите оба параметра colName и colName2 вваш :select или измените if на сторону сервера, чтобы вы ответили только одной из .text строк.например,

<% if @col == 'colName' %>
  $("#3").text("<%= escape_javascript(render(:partial => "var")) %>");
<% elsif @col == 'colName2' %>
  $("#2").text("<%= escape_javascript(render(:partial => "var1")) %>");
<% end %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...