开发者

Implementing account scoping

Currently in my application I have the concepts of projects and users. Now I'm wanting to implement an account scope for these so that both projects and users belong to an account rather than to nothing in particular. By doing this, I would like to scope my routes like this:

 scope ":account_id" do
   resources :projects
   ...
 end

However, by implementing a routing scope with a named parameter this changes how the routing helpers perform so that the project_path routing helper now expects two parameters, one for the account_id parameter and one for the id parameter, making it something like this:

  project_path(current_account, 开发者_如何学JAVAproject)

This tiny scope change requires me to make massive changes across the application in the controllers and views where I use these path helpers.

Surely, surely, surely, there's a clean way to do this without having to change every single routing helper in the application?


Use the default_url_options hash to add a default value for :account_id:

class ApplicationController < ActionController::Base
  protect_from_forgery

  before_filter :set_default_account_id

  def set_default_account_id
    self.default_url_options[:account_id] = current_account
  end
end

You can then use the url helper with a single parameter:

project_path(project)

You can override it in a view by passing :account_id as a hash parameter to a route:

project_path(project, :account_id => other_account)

Note that this won't work in the console.


Since Rails 3.0, manipulating url params is even simpler with url_options:

class ApplicationController < ActionController::Base
  protect_from_forgery

  def url_options
    { account_id: current_account.id  }.merge(super)
  end
end
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜