如何有条件地将ruby变量分配给javascript变量?

时间:2010-06-13 16:19:03

标签: javascript ruby

我有一个网站,我需要一个javascript版本的“当前用户”对象以及ruby版本。我一直在分配这些变量做这样的事情......

Application Controller:
def get_user
    begin
      @current_user = User.find(session[:user_id]) if session[:user_id]
      @current_user_json = @current_user.to_json
    rescue
      session.delete(:user_id)
      @current_user = nil
      @current_user_json = {}
    end
  end

Web Page:
var current_user = null;
current_user_json = '<%= @current_user_json %>';
if(current_user_json != ''){
        current_user = current_user_json.user;
}

即使有当前用户,我也会定义当前用户。可能是因为我将current_user_json赋值放在单引号上。但是,如果我不把它放在单引号附近,当没有用户登录时我总是会收到一个javascript错误,因为语法无效 -

current_user_json = ;

我认为我只是在看这个完全错误,必须有一个更好的方法。鉴于这可能是常见的事情,我想让其他人了解如何在javascript中创建一个与ruby对象重复的对象。

2 个答案:

答案 0 :(得分:4)

JSON是有效的Javascript。考虑删除引号并直接输出:

current_user_json = <%= @current_user.nil? ? '' : @current_user_json %>;

更好的是,让你的控制器完成所有工作,而不是在视图中放置逻辑:

@current_user_json = @current_user.nil? ? '{user: null}' : @current_user.to_json 
# ...
current_user_json = <%= @current_user_json %>;

(编辑:合并Pointy的建议如下。)

答案 1 :(得分:0)

您没有指定从to_json获取的位置。如果您使用的是“json”gem,nil.to_json会给出"null",这会在您的JS中生成current_user_json = null - 这是有效的。如果它是其他一些不这样做的库,那么最简单的可能就是覆盖to_json,以便产生有效的响应:

class NilClass
  def to_json
    "null"
  end
end