Nesting “get” request under a “get” with lambda in Rails routes
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
add a comment |
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
I think the issue is that the expression ':slug' only matches when there is no slash.
– max
Nov 17 '18 at 17:03
add a comment |
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
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
ruby-on-rails
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
add a comment |
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
add a comment |
1 Answer
1
active
oldest
votes
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
add a comment |
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
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
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
add a comment |
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
add a comment |
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
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
answered Nov 17 '18 at 18:48
trh
6,08411733
6,08411733
add a comment |
add a comment |
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.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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
I think the issue is that the expression ':slug' only matches when there is no slash.
– max
Nov 17 '18 at 17:03