I have a site that currently has URLS that look like this
http://localhost:3000/public/category/1?category_id=1
That the SEO guy has requested be changed to this
http://localhost:3000/(:category_name)-leasing
where (:category_name) is the name of the category referenced by category_id=1 and is appended with "-leasing"
Is it possible to set this up without creating a new column in my category model for a permalink.
Currently I also have this in my routes.rb file:
get ':permalink', :to => 'public#show'
which displays items from the category mentioned above as
http://localhost:3000/item-name-from-permalink
Is this going to prevent a category using the same url structure? will rails be able to distinguish between a :permalink and a (:category_name)-leasing url or will the url need to something like:
http://localhost:3000/category/(:category_name)-leasing
Thanks in advance
class Category < ActiveRecord::Base
def to_param
"#{self.id}-#{self.title.parameterize}"
end
end
will produce url like http://localhost:3000/categories/1-some-good-title
Related
I am trying to show username instead of user_id i.e., (users/4).
i have tried with changing routes file, model file as:
class User < ActiveRecord::Base
def to_param
username
end
end
and routes file as:
get '/:username' => 'users#show'
on show action it must show as fb.com/username url.
thanks in advance.
You may use friendly_id gem for this. Here is Rails cast : Pretty URLs with friendly_id On how to use it. You can use the attribute/column you want in the URL.
With FriendlyId, it's easy to make your application use URLs like:
http://example.com/states/washington
instead of:
http://example.com/states/4323454
I feel this is should be easy but I'm stuck. What's the best way to map a route and have it point to specific url?
User types/click http://acne.com/category-name and it will get http://acne.com/?category[]=1
I don't want to redirect to ?category[]=1 though. I want to make it SEO friendly.
Use the friendly_id gem.
Here is an example o how it could work:
class Category < ActiveRecord::Base
extend FriendlyId
friendly_id :name
end
#category = Category.friendly.find "category-name"
#category.to_param
redirect_to #category # the URL will be /category/category-name
If I understood your question correctly, you want to show the category when user types in acne.com/category-name.
Add this in your config/routes.rb:
get '/:category-name', to: 'category#show'
This will route the request to your categoryController's show method with the user-typed category name in the "category-name" parameter. You can handle what is displayed there (use params[:category-name] to find out the category name the user has typed in)
Sorry for the lack of code tags, I'm on mobile.
A question on SO has this url structure:
http://stackoverflow.com/questions/18474799/changing-the-input-value-in-html5-datalist
If we assume that the number section is the ID, the first two sections (after the domain extension) are obtained by simply using the following in routes.rb
resources :questions
The question is already identified by it's ID, so how do we add the (optional) decorating slug in the simplest of manners? Do we need to use a new link helper (and including additional params) or can the 3-section url be resolved elsewhere?
Update:
To focus this question more on the route-handling, let's presume there is already a slug saved on the object (upon creation) as an attribute, e.g. #question.slug
It would really be an advantage if a rule in routes.rb or/and in the controller could enable and handle the optional slug, instead of having to write long link helpers in all views.
resources :questions do
member: title
end
for slug use friendly_id and yes don't forget to have a look at Rails Routing
You might be able to use the to_param method to create a "friendly id".
Something like this:
class Question < ActiveRecord::Base
def to_param
[id, name.parameterize].join("/")
end
end
More info in this gist
If you just want to handle the GET requests in that manner, it's easy to do:
get '/questions/:id/:title' => 'questions#show', as: :question_with_title
resources :questions
This way you can handle incoming URLs with or without the title (just as StackOverflow can -- try it!). You can create urls dynamically with something like:
question_with_title_path(#question.id, #question.title.to_s.downcase.gsub(/ /, '-')
# probably will want to use a method for processing titles into url-friendly format
More at http://guides.rubyonrails.org/routing.html#static-segments
I have a question about browser string in rails.
For example i have rails app with routes:
resources :posts
and this resource create :
post/:id
post/21
post/167
post/356
but i create a simple blog and i want to rename ':id' to
post/some-name
post/another-name
post/another-different-name
in post i have title, text field
but i dont know how do this
I know that this can be achieved through manipulation of the :id
can you post some link with detailed answer on this question, or some simple example
You can of course put anything you want in the URL and actually there is railcast about it:
http://railscasts.com/episodes/63-model-name-in-url
It is preferable (read: easier) to also keep model.id in the URL, or it means that post name MUSTÂ be unique, otherwise you can put anything you want:
/post/2465-my-pretty-post-name
Also, there is a gem friendly_id and related railcast:
http://railscasts.com/episodes/314-pretty-urls-with-friendlyid
Hope that helps.
Why do you want to change /post/:id ?
You can achieve something like /post/:id/comments
You can do that using nested resources like this in your routes.rb
resources :posts do
resources :comments
end
Check here for more details
http://guides.rubyonrails.org/getting_started.html
If you add the to_param method to the model then you can use that within your URL system.
class SomeModel < ...
def to_param
self.title
end
end
Then inside your controller, setup a filter to fetch the model using the title attribute instead of the ID attribute which is used for the find method.
before_filter :setup_record
def setup_record
#record ||= Record.find_by_title(params[:id])
end
You will have to ensure that your title stays unique and if you change it then you will either have to discard all other previous URLS or keep a history of older names.
I want to be able to have post permalinks appear in the root of the site. So, for example, a post with a permalink "hello-world" should appear as "mysite.com/hello-world", instead of "mysite.com/posts_controller/hello-world."
How would I go about doing something like this?
I believe that you already have a "slug" field in your posts model.
If your post controller has that into account, you just need to add the correct route for instance:
match '/:slug' => "Posts#show"
Otherwise, if don't have the slug in your model, you can use the Stringex plugin. It's an easy way to automatic create slugs for your posts.
class Post < ActiveRecord::Base
acts_as_url :title
end
It will create the slug from your title and save it to the slug column.
In the controller you can find the correct post like this:
def show
#post = Post.find_by_slug(params[:slug])
end
In your routes:
match '/:slug' => "Posts#show"
Then in your controller you could do something like:
Post.find_by_slug(params[:slug])
Note: you will need to generate this slug value and store it in the Post model.
Also have a look at friendly_id for a tried and tested way of doing this (if you need something more complex).