Nesting “get” request under a “get” with lambda in Rails routes












0














I have a get request which looks like this and works fine:



get ':slug', :to => "countries#show", 
:constraints => lambda { |r|
Country.find_by_slug(r.params[:slug]).present? }, as: :country


This makes urls like site.com/japan work fine.



Although the structure does not look nice, I am using it because there's a lot of legacy routes that are opening under root URL.



Anyway,



I need to nest additional resources under cities:



resources :places, only: :show


To enable urls such as: site.com/japan/tv-tower



I tried going with something like:



constraints lambda { |request| 
Country.find_by_slug(request.params[:slug]).present? } do
resources places, only: :show
end


But it doesn't work.










share|improve this question






















  • I think the issue is that the expression ':slug' only matches when there is no slash.
    – max
    Nov 17 '18 at 17:03
















0














I have a get request which looks like this and works fine:



get ':slug', :to => "countries#show", 
:constraints => lambda { |r|
Country.find_by_slug(r.params[:slug]).present? }, as: :country


This makes urls like site.com/japan work fine.



Although the structure does not look nice, I am using it because there's a lot of legacy routes that are opening under root URL.



Anyway,



I need to nest additional resources under cities:



resources :places, only: :show


To enable urls such as: site.com/japan/tv-tower



I tried going with something like:



constraints lambda { |request| 
Country.find_by_slug(request.params[:slug]).present? } do
resources places, only: :show
end


But it doesn't work.










share|improve this question






















  • I think the issue is that the expression ':slug' only matches when there is no slash.
    – max
    Nov 17 '18 at 17:03














0












0








0







I have a get request which looks like this and works fine:



get ':slug', :to => "countries#show", 
:constraints => lambda { |r|
Country.find_by_slug(r.params[:slug]).present? }, as: :country


This makes urls like site.com/japan work fine.



Although the structure does not look nice, I am using it because there's a lot of legacy routes that are opening under root URL.



Anyway,



I need to nest additional resources under cities:



resources :places, only: :show


To enable urls such as: site.com/japan/tv-tower



I tried going with something like:



constraints lambda { |request| 
Country.find_by_slug(request.params[:slug]).present? } do
resources places, only: :show
end


But it doesn't work.










share|improve this question













I have a get request which looks like this and works fine:



get ':slug', :to => "countries#show", 
:constraints => lambda { |r|
Country.find_by_slug(r.params[:slug]).present? }, as: :country


This makes urls like site.com/japan work fine.



Although the structure does not look nice, I am using it because there's a lot of legacy routes that are opening under root URL.



Anyway,



I need to nest additional resources under cities:



resources :places, only: :show


To enable urls such as: site.com/japan/tv-tower



I tried going with something like:



constraints lambda { |request| 
Country.find_by_slug(request.params[:slug]).present? } do
resources places, only: :show
end


But it doesn't work.







ruby-on-rails






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Nov 17 '18 at 16:24









The Whiz of Oz

3,68563262




3,68563262












  • I think the issue is that the expression ':slug' only matches when there is no slash.
    – max
    Nov 17 '18 at 17:03


















  • I think the issue is that the expression ':slug' only matches when there is no slash.
    – max
    Nov 17 '18 at 17:03
















I think the issue is that the expression ':slug' only matches when there is no slash.
– max
Nov 17 '18 at 17:03




I think the issue is that the expression ':slug' only matches when there is no slash.
– max
Nov 17 '18 at 17:03












1 Answer
1






active

oldest

votes


















1














I'm assuming the result is not to have japan/places/tv-tower -- which is what you get if you don't set the path and the reason you aren't getting a valid route now.



I would forget about the :slug and just use resources for countries, even if it's only show, this will make sure you still have a valid route name and route for just the country with no place listed.



resources :countries, only: [:show], path: '', :constraints => proc { |req| Country.find_by_slug(req.params[:country_id].nil? ? req.params[:id] : req.params[:country_id])  } do
resources :places, path: ''
end


That will leave you with routes that look like:



       country_places GET    /:country_id(.:format)           places#index
POST /:country_id(.:format) places#create
new_country_place GET /:country_id/new(.:format) places#new
edit_country_place GET /:country_id/:id/edit(.:format) places#edit
country_place GET /:country_id/:id(.:format) places#show
PATCH /:country_id/:id(.:format) places#update
PUT /:country_id/:id(.:format) places#update
DELETE /:country_id/:id(.:format) places#destroy
country GET /:id(.:format) countries#show





share|improve this answer





















    Your Answer






    StackExchange.ifUsing("editor", function () {
    StackExchange.using("externalEditor", function () {
    StackExchange.using("snippets", function () {
    StackExchange.snippets.init();
    });
    });
    }, "code-snippets");

    StackExchange.ready(function() {
    var channelOptions = {
    tags: "".split(" "),
    id: "1"
    };
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function() {
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled) {
    StackExchange.using("snippets", function() {
    createEditor();
    });
    }
    else {
    createEditor();
    }
    });

    function createEditor() {
    StackExchange.prepareEditor({
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });














    draft saved

    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53353128%2fnesting-get-request-under-a-get-with-lambda-in-rails-routes%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    1 Answer
    1






    active

    oldest

    votes








    1 Answer
    1






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    1














    I'm assuming the result is not to have japan/places/tv-tower -- which is what you get if you don't set the path and the reason you aren't getting a valid route now.



    I would forget about the :slug and just use resources for countries, even if it's only show, this will make sure you still have a valid route name and route for just the country with no place listed.



    resources :countries, only: [:show], path: '', :constraints => proc { |req| Country.find_by_slug(req.params[:country_id].nil? ? req.params[:id] : req.params[:country_id])  } do
    resources :places, path: ''
    end


    That will leave you with routes that look like:



           country_places GET    /:country_id(.:format)           places#index
    POST /:country_id(.:format) places#create
    new_country_place GET /:country_id/new(.:format) places#new
    edit_country_place GET /:country_id/:id/edit(.:format) places#edit
    country_place GET /:country_id/:id(.:format) places#show
    PATCH /:country_id/:id(.:format) places#update
    PUT /:country_id/:id(.:format) places#update
    DELETE /:country_id/:id(.:format) places#destroy
    country GET /:id(.:format) countries#show





    share|improve this answer


























      1














      I'm assuming the result is not to have japan/places/tv-tower -- which is what you get if you don't set the path and the reason you aren't getting a valid route now.



      I would forget about the :slug and just use resources for countries, even if it's only show, this will make sure you still have a valid route name and route for just the country with no place listed.



      resources :countries, only: [:show], path: '', :constraints => proc { |req| Country.find_by_slug(req.params[:country_id].nil? ? req.params[:id] : req.params[:country_id])  } do
      resources :places, path: ''
      end


      That will leave you with routes that look like:



             country_places GET    /:country_id(.:format)           places#index
      POST /:country_id(.:format) places#create
      new_country_place GET /:country_id/new(.:format) places#new
      edit_country_place GET /:country_id/:id/edit(.:format) places#edit
      country_place GET /:country_id/:id(.:format) places#show
      PATCH /:country_id/:id(.:format) places#update
      PUT /:country_id/:id(.:format) places#update
      DELETE /:country_id/:id(.:format) places#destroy
      country GET /:id(.:format) countries#show





      share|improve this answer
























        1












        1








        1






        I'm assuming the result is not to have japan/places/tv-tower -- which is what you get if you don't set the path and the reason you aren't getting a valid route now.



        I would forget about the :slug and just use resources for countries, even if it's only show, this will make sure you still have a valid route name and route for just the country with no place listed.



        resources :countries, only: [:show], path: '', :constraints => proc { |req| Country.find_by_slug(req.params[:country_id].nil? ? req.params[:id] : req.params[:country_id])  } do
        resources :places, path: ''
        end


        That will leave you with routes that look like:



               country_places GET    /:country_id(.:format)           places#index
        POST /:country_id(.:format) places#create
        new_country_place GET /:country_id/new(.:format) places#new
        edit_country_place GET /:country_id/:id/edit(.:format) places#edit
        country_place GET /:country_id/:id(.:format) places#show
        PATCH /:country_id/:id(.:format) places#update
        PUT /:country_id/:id(.:format) places#update
        DELETE /:country_id/:id(.:format) places#destroy
        country GET /:id(.:format) countries#show





        share|improve this answer












        I'm assuming the result is not to have japan/places/tv-tower -- which is what you get if you don't set the path and the reason you aren't getting a valid route now.



        I would forget about the :slug and just use resources for countries, even if it's only show, this will make sure you still have a valid route name and route for just the country with no place listed.



        resources :countries, only: [:show], path: '', :constraints => proc { |req| Country.find_by_slug(req.params[:country_id].nil? ? req.params[:id] : req.params[:country_id])  } do
        resources :places, path: ''
        end


        That will leave you with routes that look like:



               country_places GET    /:country_id(.:format)           places#index
        POST /:country_id(.:format) places#create
        new_country_place GET /:country_id/new(.:format) places#new
        edit_country_place GET /:country_id/:id/edit(.:format) places#edit
        country_place GET /:country_id/:id(.:format) places#show
        PATCH /:country_id/:id(.:format) places#update
        PUT /:country_id/:id(.:format) places#update
        DELETE /:country_id/:id(.:format) places#destroy
        country GET /:id(.:format) countries#show






        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered Nov 17 '18 at 18:48









        trh

        6,08411733




        6,08411733






























            draft saved

            draft discarded




















































            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.





            Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


            Please pay close attention to the following guidance:


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53353128%2fnesting-get-request-under-a-get-with-lambda-in-rails-routes%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            Biblatex bibliography style without URLs when DOI exists (in Overleaf with Zotero bibliography)

            ComboBox Display Member on multiple fields

            Is it possible to collect Nectar points via Trainline?