对于其他类型的变量,我使用||=,但这对布尔值不起作用(x ||= true即使x先前被赋值为false,也将x指定为true).
我认为这会奏效:
x = true unless defined?(x)
Run Code Online (Sandbox Code Playgroud)
但事实并非如此:出于某种原因,它将x分配给nil.(这里的解释将不胜感激.)
我知道一种有效的方法:
unless defined?(x)
x = true
end
Run Code Online (Sandbox Code Playgroud)
但它相当冗长.有没有更简洁的方法在Ruby中为布尔变量赋值默认值?
我正在尝试为我的Rails 3应用程序创建一个JSONP API.现在在我的控制器中,我有很多遵循这种模式的动作:
# This is from my users_controller.rb, as an example
def index
@users = User.all
respond_with(@users, :callback => params[:callback])
end
Run Code Online (Sandbox Code Playgroud)
虽然这是按原样运作的,但我想通过不必重复:callback => params[:callback]每一个动作的呼叫来干它respond_with.我怎样才能做到这一点?
更新:有一件事我已经意识到我的上述代码是丑陋的,该:callback => params[:callback]选项将被传递给任何响应格式,而不仅仅是JSON.以下代码可能更正确:
def index
@users = User.all
respond_with(@users) do |format|
format.json { render :json => @users, :callback => params[:callback]}
end
end
Run Code Online (Sandbox Code Playgroud)
我有几种方法可以解决这个问题,但我无法弄清楚如何使它们工作:
render(可能在应用程序控制器中),以便它接受:jsonp自动包含:callback => params[:callback]参数的选项.这样我可以将上面的代码更改为以下代码,这有点短:def index
@users = User.all
respond_with(@users) do |format|
format.json { render :jsonp => @users}
end
end …Run Code Online (Sandbox Code Playgroud) 在Rails 3中,您可以设置根路径以从config/routes.rb重定向到其他位置:
root :to => redirect("/dashboard")
Run Code Online (Sandbox Code Playgroud)
这有效,除了它消除了传递给root的任何flash参数.你怎么能通过重定向传递它们?
更新: James Chen的解决方案,即重写路线声明root :to => redirect { |p, req| req.flash.keep; "/dashboard" },对我有用.但有两件事我不明白:
p代表,params?我尝试使用do/ end和换行符重写块:
root :to => redirect do |p, req|
req.flash.keep
"/dashboard"
end
Run Code Online (Sandbox Code Playgroud)
但这失败了"ArgumentError:不支持重定向参数".为什么是这样?