Forum: Ruby on Rails How does Basecamp 'scope' distinct users in a monolithic dat

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
18989f5699fa8619c8e9b301b6cb5088?d=identicon&s=25 BraveDave (Guest)
on 2007-03-22 00:32
(Received via mailing list)
I'm hoping to find someone who realizes the implications of this
design strategy. I am attempting to build an application that access a
common monolithic database but each user has a 'scope' so they only
see their data..
My strategy is to create an http request that looks like
project.controller.action.keyvalue and pass this throughout the
application. The "Project" term is used to describe a distinct data
scope that one user or a group would maintain.
I expect we'd make http calls like http:\
\project.controller.action.keyvalue and database calls like:
link_to: #{table.row.columname}
                                               :Project => project
                                               :Controller=>controller
                                               :Action=> action
                                               :Id => id

The patriarch of all RonR programs written by DHH (Basecamp) must
utilize a strategy similar to this as they are running the same
generic program, but accessing distinct data from one monolithic
database.
When Basecamp passes an http: request it's got to hold inside this
package the group database, user, controller, action and value. Does
anyone know the basic architecture of how this is accomplished?
I found one clue to this question today when looking at the the
ActionPack API and in it, DHH wrote:

Routing makes pretty urls incredibly easy
  map.connect 'clients/:client_name/:project_name/:controller/:action'

  Accessing /clients/37signals/basecamp/project/dash calls
ProjectController#dash with
  { "client_name" => "37signals", "project_name" => "basecamp" } in
params[:params]

  From that URL, you can rewrite the redirect in a number of ways:

  redirect_to(:action => "edit") =>
    /clients/37signals/basecamp/project/dash

  redirect_to(:client_name => "nextangle", :project_name => "rails")
=>
    /clients/nextangle/rails/project/dash

I am willing to pay for someone to teach me how this is done.

Thank you,
David
VirtualLifestyle@gmail.com
8222471351de475ccbc18f42350a04d8?d=identicon&s=25 Krishna Dole (Guest)
on 2007-03-22 00:56
(Received via mailing list)
hi dave,

my apologies if i misunderstood your question, but if you're asking
about the routing, you can set up a route like so:

    map.connect 'projects/:project_id/:controller/:action/:id'

and when you use link_to, you only have to specify :project_id on the
link that takes them into the project; subsequently, omitted
:project_id and :controller default to the current one. so once in the
widget controller for project 42, you can make links like:

  link_to @widget.name , :action => "show", :id => @widget

which will create a link to: /projects/42/widget/show/23

of course on each request you need to validate that the user is a
member of the project and that the data they are asking for belongs to
the project.

hope that helps,
krishna
Db303dc84d03a992b33cd3ac978f89ae?d=identicon&s=25 Benjamin Curtis (Guest)
on 2007-03-22 17:19
(Received via mailing list)
Take a look at this plugin for clues: http://agilewebdevelopment.com/
plugins/account_location

--
Building an e-commerce site with Rails?
http://agilewebdevelopment.com/rails-ecommerce

Meet up at RailsConf:
http://railsconf2007.conferencemeetup.com/
This topic is locked and can not be replied to.