Frage Account-Scoping implementieren


Derzeit habe ich in meiner Anwendung die Konzepte von Projekten und Benutzern. Jetzt möchte ich einen Account-Umfang für diese implementieren, so dass sowohl Projekte und Benutzer zu einem Konto statt zu nichts speziell gehören. Auf diese Weise möchte ich meine Routen folgendermaßen definieren:

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

Durch Implementieren eines Routings scope Mit einem benannten Parameter ändert sich, wie die Routing-Helfer arbeiten, so dass der project_path routing helper erwartet nun zwei Parameter, einen für den account_id Parameter und eine für die id Parameter, machen es so etwas:

  project_path(current_account, project)

Dies sehr klein  scope Veränderung erfordert, dass ich mache massiv ändert sich über die Anwendung in den Controllern und Ansichten, wo ich diese Pfadhelfer verwenden.

Sicherlich, sicherlich, gibt es einen sauberen Weg, dies zu tun, ohne jeden einzelnen Routing-Helfer in der Anwendung ändern zu müssen?


12
2018-01-06 10:37


Ursprung


Antworten:


Verwenden Sie den Hash "default_url_options", um einen Standardwert für "account_id" hinzuzufügen:

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

Sie können dann den URL-Helper mit einem einzelnen Parameter verwenden:

project_path(project)

Sie können es in einer Ansicht überschreiben, indem Sie: account_id als Hash-Parameter an eine Route übergeben:

project_path(project, :account_id => other_account)

Beachten Sie, dass dies in der Konsole nicht funktioniert.


13
2018-01-06 11:37



Seit Rails 3.0 ist die Manipulation von URL-Parametern noch einfacher url_optionen:

class ApplicationController < ActionController::Base
  protect_from_forgery

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

1
2017-08-27 11:28