Reputation: 1435
On my site a user has a personal profile with a link to his personal external website. The url of the sites I store in a postgresql database under the name website. When I test the result, I always get a url like this:
http://localhost:3000/www.example.com
instead of http://www.example.com
My view index.html.erb looks like this:
<% provide(:title, 'All projects') %>
<h1>All projects</h1>
<%= will_paginate %>
<ul class="microposts">
<%= render @microposts %>
</ul>
<%= will_paginate %>
and my _micropost.html.erb like this:
<li>
<span class="title"><%= micropost.title %></span>
<span class="website"><%= link_to micropost.website, micropost.website %></span>
<span class="content"><%= micropost.content %></span>
<span class="timestamp">
Posted <%= time_ago_in_words(micropost.created_at) %> ago.
</span>
</li>
I don't know what's the problem in this case. If I set a @ before micropost.website it gives me an error undefined method `website' for nil:NilClass
Does anyone can help me (I'm a RoR beginner)?
KR, Fabian
Upvotes: 46
Views: 53591
Reputation: 595
You can try with this below code:
<%= link_to "your label", "your link with http", :target => "_blank" %>
This will create a link that opens in a new tab.
Upvotes: 24
Reputation: 10084
I'm working with Rails 5 and I had the same problem. All I need to do to fix it, was to include the protocol on my link_to
tag. E.g. I had www.google.com.mx
, then, it should be http://www.google.com.mx
. And that's it it works just fine like in the official doc is mentioned.
So, finally I just have something like this in my view:
<%= link_to (content_tag(:i, "help", class: 'material-icons tiny')), " http://www.google.com.mx", target: "_blank", rel: "alternate" %>
Which is the same as:
<%= link_to "help", "http://www.google.com.mx", target: "_blank", rel: "alternate" %>
I hope it helps somebody else.
Upvotes: 0
Reputation: 4306
You can use the ruby URI class
= link_to micropost.website, URI::HTTP.build({:host => micropost.website}).to_s, target: "_blank"
# <a target="_blank" href="http://www.example.com">www.example.com</a>
Upvotes: 3
Reputation: 18127
I use the postrank-uri gem to normalize the url before passing it to link_to
.
class User < ActiveRecord::Base
def normalized_webpage
webpage && PostRank::URI.normalize(webpage).to_s
end
end
Then you can use link_to "website", user.normalized_webpage, target: "_blank"
in your view. This will for example add the http://
to the url, if it's missing.
Upvotes: 0
Reputation:
Here's what i did.
Let's say we have @person and he has a link (@person.link) # => www.google.com
in your helpers create something like this
def extlink(link)
if link.include?("http://")
puts link
else
link.insert(0, "http://")
link
end
end
And in your file you can do
<% @person.each do |p| %>
<%= link_to 'External', extlink(p.link) %>
<% end %>
Works for me
Upvotes: -2
Reputation: 81
You can do something like that:
link_to micropost.website, url_for(micropost.website)
You can experiment in rails console. Just type in console:
micropost = Micropost.first
helper.link_to micropost.website, url_for(micropost.website)
And you see a result string.
Also you need to learn the difference between path and url helpers. See ruby on rails guide.
Goro rights. You need to add "http://" to your website attribute. After validating and before save Model instance to database you need to add this prefix.
Upvotes: 3
Reputation: 998
It sounds like you are storing URLs without the http://
so they are being interpreted as relative URLs. You just need to do something like this:
link_to micropost.website, "http://#{micropost.website}"
or maybe add a full_url
method to that model that adds it if it's missing.
By the way, you can't use @micropost
in that partial because it doesn't exist (you only have @microposts
or micropost
).
Upvotes: 70