将 rails 实例变量用于 javascript 条件

Using a rails instance variable for javascript conditional

本文关键字:javascript 条件 用于 变量 rails 实例      更新时间:2023-09-26

在我的application_controller中。

def ensure_service_agreement
  if current_user.agrees_to_service == true
    @tos = true
  else
    @tos = false
  end
end

我的应用程序.js文件中有以下代码。

var tos = "<%= @tos %>";
if(tos == false){
  $(".new-session-home").on('click', function (){
      $('.booking.modal')
      .modal('show');
    })
}else{
  $(".new-session-home").on('click', function (){
      $('.tos.modal')
      .modal('show');
    })
}

javascript似乎没有注册var tos。 当我将第一个 if 语句设置为 true 或 false 时,我得到第二个模态(tos modal)

如果我设置 tos = 4 然后检查该数字,它会正常工作,所以我知道问题出在 rails 实例变量上。

如何让 JS 理解我的实例变量?

我使用了gon gem。

步骤:

宝石文件.rb

gem 'gon'

应用程序.html.erb

<%= include_gon %>

回到我的application_controller.rb

def ensure_service_agreement
 if current_user.agrees_to_service == true
  @tos = true
  gon.tos = true
 else
  @tos = false
  gon.tos = false
 end
end

最后是我的 js

dayClick: function(date, allDay, jsEvent, view) {
    if(gon.tos == true) {
              $('.booking.modal').modal('show');
              console.log(date)
    } else {
              $('.tos.modal').modal('show');
    }
}

您正在尝试操作 js 文件中的 rails 代码。但是你不会在那里得到任何 erb 语法。

有多种解决方案可以解决此类请求。如果您要提交表单或重定向到某个 url,那么您可以使用 ujs 来执行此操作(使用 :remote => true )。

UJS 响应.js.erb文件中,您可以访问 js 和 erb 语法。

如果您没有提交或没有 url 更改,那么您只能使用 jquery 轻松执行此操作。

<a href='#' onclick="somefunction(true/false)">booking/tos</a> 

作为你的代码结构,你应该选择UJS。

不确定,这是一个理想的解决方案。

您已ensure_service_agreement方法中设置了值。

使用渲染器文件,如ensure_service_agreement.js.erbensure_service_agreement.html.erb

并将值保留在输入标签中。

<input name='' id='tos' value = '<%= @tos %>'> use type hidden or style with display:none

并在 Js 文件中访问,例如

var tos = $('#tos').val();