How can I make my custom url helpers in rails?
I'd like this custom url helper to be accessible from controllers, views, tests... Ending with both _url and _path. Also it should have the possibility to add parameters at the end as a url helper.
def reviews(reviewable)
"/reviews/#{reviewable.class}/#{reviewable.id}"
end
reviews_url Book.find(1) # /reviews/Book/1
reviews_path Film.find(3) # /reviews/Film/3
Review.reviewable is polymorphic.
config/routes
get "reviews/:reviewable_type/:reviewable_id" => "reviews#index"
ruby-on-rails ruby ruby-on-rails-5
add a comment |
I'd like this custom url helper to be accessible from controllers, views, tests... Ending with both _url and _path. Also it should have the possibility to add parameters at the end as a url helper.
def reviews(reviewable)
"/reviews/#{reviewable.class}/#{reviewable.id}"
end
reviews_url Book.find(1) # /reviews/Book/1
reviews_path Film.find(3) # /reviews/Film/3
Review.reviewable is polymorphic.
config/routes
get "reviews/:reviewable_type/:reviewable_id" => "reviews#index"
ruby-on-rails ruby ruby-on-rails-5
add a comment |
I'd like this custom url helper to be accessible from controllers, views, tests... Ending with both _url and _path. Also it should have the possibility to add parameters at the end as a url helper.
def reviews(reviewable)
"/reviews/#{reviewable.class}/#{reviewable.id}"
end
reviews_url Book.find(1) # /reviews/Book/1
reviews_path Film.find(3) # /reviews/Film/3
Review.reviewable is polymorphic.
config/routes
get "reviews/:reviewable_type/:reviewable_id" => "reviews#index"
ruby-on-rails ruby ruby-on-rails-5
I'd like this custom url helper to be accessible from controllers, views, tests... Ending with both _url and _path. Also it should have the possibility to add parameters at the end as a url helper.
def reviews(reviewable)
"/reviews/#{reviewable.class}/#{reviewable.id}"
end
reviews_url Book.find(1) # /reviews/Book/1
reviews_path Film.find(3) # /reviews/Film/3
Review.reviewable is polymorphic.
config/routes
get "reviews/:reviewable_type/:reviewable_id" => "reviews#index"
ruby-on-rails ruby ruby-on-rails-5
ruby-on-rails ruby ruby-on-rails-5
asked Nov 21 '18 at 16:30
Chiara Piccinini NúñezChiara Piccinini Núñez
32
32
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
I would just define the routes as:
resources :books do
resources :reviews, only: [:new, :create, :index]
end
resources :films do
resources :reviews, only: [:new, :create, :index]
end
This will create the routes as:
books/:book_id/reviews
films/:film_id/reviews
This is the conventional RESTful way to define nested resources. And more importantly it works with the Rails polymorphic route helpers.
You can use routing concerns to DRY it if needed.
concern :reviewable do
resources :reviews, only: [:new, :create, :index]
end
resources :books, concerns: :reviewable
resources :films, concerns: :reviewable
It gives you the named route helpers book_reviews_path(@book)
and film_reviews_path(@film)
. You can also use the polymorphic route helpers:
<%= link_to "Reviews for #{@reviewable.title}" [@reviewable, :reviews] %>
...
<%= form_for([@reviewable, @reviewable.review.new]) do %>
...
redirect_to [@reviewable, :reviews], notice: 'Review created'
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%2f53416563%2fhow-can-i-make-my-custom-url-helpers-in-rails%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 would just define the routes as:
resources :books do
resources :reviews, only: [:new, :create, :index]
end
resources :films do
resources :reviews, only: [:new, :create, :index]
end
This will create the routes as:
books/:book_id/reviews
films/:film_id/reviews
This is the conventional RESTful way to define nested resources. And more importantly it works with the Rails polymorphic route helpers.
You can use routing concerns to DRY it if needed.
concern :reviewable do
resources :reviews, only: [:new, :create, :index]
end
resources :books, concerns: :reviewable
resources :films, concerns: :reviewable
It gives you the named route helpers book_reviews_path(@book)
and film_reviews_path(@film)
. You can also use the polymorphic route helpers:
<%= link_to "Reviews for #{@reviewable.title}" [@reviewable, :reviews] %>
...
<%= form_for([@reviewable, @reviewable.review.new]) do %>
...
redirect_to [@reviewable, :reviews], notice: 'Review created'
add a comment |
I would just define the routes as:
resources :books do
resources :reviews, only: [:new, :create, :index]
end
resources :films do
resources :reviews, only: [:new, :create, :index]
end
This will create the routes as:
books/:book_id/reviews
films/:film_id/reviews
This is the conventional RESTful way to define nested resources. And more importantly it works with the Rails polymorphic route helpers.
You can use routing concerns to DRY it if needed.
concern :reviewable do
resources :reviews, only: [:new, :create, :index]
end
resources :books, concerns: :reviewable
resources :films, concerns: :reviewable
It gives you the named route helpers book_reviews_path(@book)
and film_reviews_path(@film)
. You can also use the polymorphic route helpers:
<%= link_to "Reviews for #{@reviewable.title}" [@reviewable, :reviews] %>
...
<%= form_for([@reviewable, @reviewable.review.new]) do %>
...
redirect_to [@reviewable, :reviews], notice: 'Review created'
add a comment |
I would just define the routes as:
resources :books do
resources :reviews, only: [:new, :create, :index]
end
resources :films do
resources :reviews, only: [:new, :create, :index]
end
This will create the routes as:
books/:book_id/reviews
films/:film_id/reviews
This is the conventional RESTful way to define nested resources. And more importantly it works with the Rails polymorphic route helpers.
You can use routing concerns to DRY it if needed.
concern :reviewable do
resources :reviews, only: [:new, :create, :index]
end
resources :books, concerns: :reviewable
resources :films, concerns: :reviewable
It gives you the named route helpers book_reviews_path(@book)
and film_reviews_path(@film)
. You can also use the polymorphic route helpers:
<%= link_to "Reviews for #{@reviewable.title}" [@reviewable, :reviews] %>
...
<%= form_for([@reviewable, @reviewable.review.new]) do %>
...
redirect_to [@reviewable, :reviews], notice: 'Review created'
I would just define the routes as:
resources :books do
resources :reviews, only: [:new, :create, :index]
end
resources :films do
resources :reviews, only: [:new, :create, :index]
end
This will create the routes as:
books/:book_id/reviews
films/:film_id/reviews
This is the conventional RESTful way to define nested resources. And more importantly it works with the Rails polymorphic route helpers.
You can use routing concerns to DRY it if needed.
concern :reviewable do
resources :reviews, only: [:new, :create, :index]
end
resources :books, concerns: :reviewable
resources :films, concerns: :reviewable
It gives you the named route helpers book_reviews_path(@book)
and film_reviews_path(@film)
. You can also use the polymorphic route helpers:
<%= link_to "Reviews for #{@reviewable.title}" [@reviewable, :reviews] %>
...
<%= form_for([@reviewable, @reviewable.review.new]) do %>
...
redirect_to [@reviewable, :reviews], notice: 'Review created'
answered Nov 21 '18 at 17:13
maxmax
45.8k859104
45.8k859104
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.
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%2f53416563%2fhow-can-i-make-my-custom-url-helpers-in-rails%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