I'm developing a web application using rails.
For aesthetic purposes, i need to replace %20 with -
Before: http://localhost:3000/movies/2006/Apna%20Sapna%20Money%20Money
After: http://localhost:3000/movies/2006/Apna-Sapna-Money-Money
Is there anyway i can achieve this in rails?
You should use URI.parse to break it into pieces and then change only the path component:
require 'uri'
u = URI.parse(url)
u.path = u.path.gsub('%20', '-')
url = u.to_s
Just a simple gsub on the whole URL would probably work fine but a little extra paranoia might save you some confusion and suffering down the road. Also, if you're just replacing a literal string rather than a regular expression, you can use a String as the first argument to gsub and avoid some escaping issues:
The pattern is typically a Regexp; if given as a String, any regular expression metacharacters it contains will be interpreted literally, e.g. '\\d' will match a backlash followed by d, instead of a digit.
If your string is stored in the variable url you can use
url.gsub(/%20/, "-")
to return the string you want, or
url.gsub!(/%20/, "-")
to actually modify the value of url with the value you want.
https://github.com/FriendlyId/friendly_id
this is the best way to go about seo urls
You probably want to be saving "Apna-Sapna-Money-Money" within your Movies model as an attribute (I usually call these slugs). Then, to generate these, you might just need to replace spaces in the movie title with hyphens. Something like:
class Movie
before_create :generate_slug
private
def generate_slug
slug = title.gsub(" ", "-")
end
end
Then in your controller action you can simply do a Movie.find_by_slug!(params[:id]) call.
Basically, there should be no reason for users to ever arrive at a URL with %20 in it...
Related
I am having trouble formatting my string correctly. I am reading strings from a file and trying to use them as js code.
file_line = blah'blah"blah
string = line.gsub(/'/, "\\\'").gsub(/"/, "\\\"").dump
I want the output to be:
blah\'blah\"blah
But I cant seem to format it right. I have tried a bunch of things.
I'd use a single gsub matching both, ' and ", along with a block to prepend a \:
line = %q{blah'blah"blah}
string = line.gsub(/["']/) { |m| "\\#{m}" }
#=> "blah\\'blah\\\"blah"
puts string
Output:
blah\'blah\"blah
string = "blah'blah\"blah"
puts string.gsub(/'/,"\\\\'").gsub(/"/,'\"') # => blah\'blah\"blah
There's a whole lot of escaping going on here. To be honest I don't really understand the first one, but the second one is simple. I think in the first one we are escaping the backslash we want to add, and then escaping those two backslashes to avoid ruby interpretting them as a reference to the string. Or something. Trying to do a single level of escaping yields this:
puts string.gsub(/'/,"\\'").gsub(/"/,'\"') # => blahblah\"blahblah\"blah
I want to get some specific value from string of Rails like below these are two string.
1. "http://localhost:3000/admin/shops/assign_shoes?id=50&page=1"
2. "http://localhost:3000/admin/shops/assign_shoes?id=50"
I always need value of "id" which is "50". Don't matter how many parameters are in string
as query string.
Actually these strings are values of request.referer
Any efficient method?
Thanks
Here is one of the ways:
require 'uri'
require 'cgi'
uri = URI.parse("http://localhost:3000/admin/shops/assign_shoes?id=50&page=1")
# => #<URI::HTTP:0x000001018dc5c8 URL:http://localhost:3000/admin/shops/assign_shoes?id=50&page=1>
uri_params = CGI.parse(uri.query)
# => {"id"=>["50"], "page"=>["1"]}
uri_params["id"].first #=> "50" - NOTE: this will be a String!!
However, I'd prefer the answer which uses regular expressions.
Use regular expressions.
id = /\/admin\/shops\/assign_shoes\?id=(\d+)/.match(request.referer)[1]
There are several different ways to do this, the common way I know about is parsing the string using the URI class, and making use of the CGI class to extract the query params, like so:
uri = URI.parse(request.referer)
parsed_query = CGI::parse(uri.query).symbolize_keys
id_value = parsed_query[:id].first
Note the .first, as the values of the query params are resolved to arrays. Additionally, the keys are parsed in to strings, therefore I would include symbolize_keys for convenience and consistency.
I want to check a string and change any #something to link. So I have a helper function which consists of something like this:
def parse(content)
content.gsub(/#[a-zA-z0-9]+\b/, link_to("#{$1}", user_path($1)) )
end
But the result is
The problem is :
The is a string, because somehow the < and > is escaped.
Why does "#{$1}" return nothing? Isn't it supposed to return whatever is checked upon, in this case #something?
Rails HTML-escapes any content produced by a user-defined helper, unless you tell it not to. Try using <%= raw parse(content) %> in your view.
Quoting Pickaxe on gsub:
If a string is used as the replacement, special variables from the match (such as $& and $1)
cannot be substituted into it, because substitution into the string occurs before the pattern match
starts. However, the sequences \1, \2, and so on, may be used to interpolate successive numbered
groups in the match, and \k<name> will substitute the corresponding named captures.
So you can't use #{$1} because $1 isn't set until after the command has finished. Your best bet is probably to use the block form of gsub - in which case $1 is set inside the block. Try:
def parse(content)
content.gsub(/#[a-zA-z0-9]+\b/) {link_to($1, user_path($1))}
end
i have
string = "$575.00 "
string.to_f
// => 0.0
string = "575.00 "
string.to_f
// => 575.0
the value coming in is in this format and i need to insert into a database field that is decimal any suggestions
"$575.00 "
We did this so often we wrote an extension to String called cost_to_f:
class String
def cost_to_f
self.delete('$,').to_f
end
end
We store such extensions in config/initializers/extensions/string.rb.
You can then simply call:
"$5,425.55".cost_to_f #=> 5425.55
If you are using this method rarely, the best bet is to simply create a function, since adding functions to core classes is not exactly something I would recommend lightly:
def cost_to_f(string)
string.delete('$,').to_f
end
If you need it in more than one class, you can always put it in a module, then include that module wherever you need it.
One more tidbit. You mentioned that you need to process this string when it is being written to the database. With ActiveRecord, the best way to do this is:
class Item < ActiveRecord::Base
def price=(p)
p = p.cost_to_f if p.is_a?(String)
write_attribute(:price, p)
end
end
EDIT: Updated to use String#delete!
So many answers... i'll try to summarize all that are available now, before give own answer.
1. string.gsub(/[\$,]/, '')
string.gsub!(/^\$/, '')
2. string[1..-1]
3. string.slice(0) # => "ome string"
4. s/^.//
Why (g)sub and regexp Just for deleting a character? String#tr is faster and shorter. String#delete is even better.
Good, fast, simple. Power of reverse indexing.
Hm... looks like it returns "S". Because it is an alias to String#[]
Perl? /me is cheking question tags...
And my advice is:
What if you have not dollar, but yena? Or what if you don't even have anything before numbers?
So i'll prefer:
string[/\d.+/]
This will crop leading non-decimal symbols, that prevent to_f to work well.
P.S.: By the way. It's known, that float is bad practice for storing money amounts.
Use Float or Decimal for Accounting Application Dollar Amount?
You could try something like this.
string = string[1..-1] if string.match(/^\$/)
Or this.
string.gsub!(/^\$/, '')
Remember to put that backslash in your Regexp, it also means "end of string."
you can use regex for that:
s/^.//
As laways, this is PCRE syntax.
In Ruby, you can use the sub() method of the string class to replace the string:
result = string.sub(/^./,"")
This should work.
[EDIT]
Ok, someone asked what's the gsub() is for:
gsub() acts like sub() but with the /g modifier in PCRE (for global replacement):
s/a/b/
in PCRE is
string.sub(/a/, "b")
and
s/a/b/g
is
string.gsub(/a/, "b")
in Ruby
What I'd use (instead of regular expressions) is simply the built-in slice! method in the String class. For example,
s = "Some string"
s.slice!(0) # Deletes and returns the 0th character from the string.
s # => "ome string"
Documentation here.
I am using a user input string to create a url and I only want the url to contain lowercase letters and hyphens
e.g. example.com/this-is-a-url
In my model, I have added so far:
def to_param
name.downcase.gsub(" ", "-")
end
This makes it lowercase and hyphenated. How can I remove all illegal characters, such as '/"$£%& and so on? A regular expression might be the answer but is there something built in for this purpose already in Rails?
Perhaps instead of doing the above, I should create a validation that makes sure that 'name' is only spaces and letters? Is there something built in for this purpose?
You can use ActiveSupport's parameterize method:
def to_param
name.parameterize
end
parameterize API documentation
You might consider the to_slug plugin for this. See also this related question.