我有一个网站,我需要一个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对象重复的对象。
答案 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