Tag: routing

Rails routes: limiting access to application parts from certain domains (hosts)

Sometimes we want to handle different parts of a single application from different domains. A good example of such an approach is when we have a scope containing our API. Wouldn't it be great if it could be served from a different domain than the rest of the application? Of course yes! Approach like this (separating the API from the rest of the app) is used in several popular web applications. For example in Twitter. The app is under twitter.com and the API lies under the api.twitter.com url. When you have a smaller Rails app, probably you maintain the API-part and the user-part in one Rails project. The separate domains approach allows you to easily move to the two different apps, when the time comes.

So, how to limit access to the app parts based on the domain? Let's use constraints. Let's assume, that we have a scope called :api and the scope called :ui. Each scope represents a module in our app:

scope :module => :api do
  # Some resources and additional routes here
  # Api::SomeController...
end

scope :module => :ui do
  # Some resources and additional routes here
  # Ui::SomeController...
end

To make it domain-accessible we just need to wrap it with a block like this one:

constraints(:host => 'my_domain') do
# Routes here
end

where the my_domain is a domain that should be used with our app part. So for the example above, it would look like this:

constraints(:host => 'api.example.com') do
  scope :module => :api do
    # Some resources and additional routes here
    # Api::SomeController...
  end
end

constraints(:host => 'my.app.example.com') do
  scope :module => :ui do
    # Some resources and additional routes here
    # Ui::SomeController...
  end
end

NoMethodError: undefined method `split’ for true:TrueClass

Weird errors occurs:

NoMethodError: undefined method `split' for true:TrueClass
    /long_path/actionpack-3.1.3/lib/action_dispatch/routing/route_set.rb:360:in `block in <class:Generator>'
    /long_path/rack-mount-0.8.3/lib/rack/mount/generatable_regexp.rb:197:in `call'
    /long_path/rack-mount-0.8.3/lib/rack/mount/generatable_regexp.rb:197:in `parameterize'
    /long_path/rack-mount-0.8.3/lib/rack/mount/generatable_regexp.rb:170:in `block in generate_from_segments'
    /long_path/rack-mount-0.8.3/lib/rack/mount/generatable_regexp.rb:164:in `map'
    /long_path/rack-mount-0.8.3/lib/rack/mount/generatable_regexp.rb:164:in `generate_from_segments'
    /long_path/rack-mount-0.8.3/lib/rack/mount/generatable_regexp.rb:57:in `generate'
    /long_path/rack-mount-0.8.3/lib/rack/mount/route.rb:107:in `generate'
    /long_path/rack-mount-0.8.3/lib/rack/mount/route_set.rb:242:in `block in generate'
    /long_path/rack-mount-0.8.3/lib/rack/mount/route_set.rb:240:in `each'
    /long_path/rack-mount-0.8.3/lib/rack/mount/route_set.rb:240:in `generate'
    /long_path/actionpack-3.1.3/lib/action_dispatch/routing/route_set.rb:453:in `generate'
    /long_path/actionpack-3.1.3/lib/action_dispatch/routing/route_set.rb:494:in `generate'
    /long_path/actionpack-3.1.3/lib/action_dispatch/routing/route_set.rb:490:in `generate_extras'
    /long_path/actionpack-3.1.3/lib/action_dispatch/routing/route_set.rb:486:in `extra_keys'
    /long_path/actionpack-3.1.3/lib/action_controller/test_case.rb:145:in `assign_parameters'
    /long_path/actionpack-3.1.3/lib/action_controller/test_case.rb:438:in `process'
    /long_path/actionpack-3.1.3/lib/action_controller/test_case.rb:49:in `process'
    /long_path/devise-2.0.1/lib/devise/test_helpers.rb:19:in `block in process'
    /long_path/devise-2.0.1/lib/devise/test_helpers.rb:70:in `catch'
    /long_path/devise-2.0.1/lib/devise/test_helpers.rb:70:in `_catch_warden'
    /long_path/devise-2.0.1/lib/devise/test_helpers.rb:19:in `process'
    /long_path/actionpack-3.1.3/lib/action_controller/test_case.rb:370:in `post'

when trying to perform get request in functional tests:

get :smthng

So WTF? This type of error occurs when we have a route with :format:

    post '/' => 'smthing#create', :format => true

but the request is performed without :format option. To fix it, just add :format into your request:

get :smthng, :format => :json

Copyright © 2024 Closer to Code

Theme by Anders NorenUp ↑