The link_to Helper
link_to
Let's now make adjustments for the index view template for posts.
<!-- app/views/posts/index.html.erb -->
<html>
<body>
<div class="posts">
<% @posts.each do |post| %>
<!-- use `@posts` instead of `posts` -->
<div class="post">
<h2 class="title">
<%= link_to post.title, post_path(post.id) %>
</h2>
<small class="meta">
<span class="author">by <%= post.author %> -</span>
<em class="created_at"><%= post.created_at %></em>
<%= link_to 'Edit', edit_post_path(post.id) %>
<form method="post" action="/posts/<%= post.id %>" style='display: inline'>
<input type="submit" value="Delete" />
</form>
</small>
</div>
<hr />
<% end %>
</div>
<%= link_to 'New Post', new_post_path %>
</body>
</html>
We have moved the view template to its conventional location, changed its name, utilized our instance variables from the controller, and we have also used the link helper link_to.
link_to works like this:
<%= link_to 'Link Text', url_or_path %>
We're also making use of our route-defined path helper methods in combination with link_to. For example, here we make the link to posts/show with:
<%= link_to post.title, post_path(post.id) %>
More About Helpers
link_to is a Rails built in helper that helps generate an anchor tag. To understand what it does and how it actually works, let's build a similar helper ourselves.
Helpers, or more specifically, view helpers are methods that generate HTML snippets to be placed in a view. To get a feel for what this means, let's take a look at a Rails-provided helper we've already seen:
<%= link_to 'Back to Posts', posts_path %>
<!-- this generates the HTML... -->
<a href="/posts">Back to Posts</a>
link_to is a helper method provided by Rails, but we can easily define a simple version of this helper ourselves. We'll name it my_link_to and place it in app/helpers/application_helper.rb - methods defined here will automatically become helpers and can be used in views.
### app/helpers/application_helper.rb ###
module ApplicationHelper
def my_link_to(text, href)
"<a href='#{href}'>#{text}</a>".html_safe
end
end
Our my_link_to method is incredibly simple. It returns an <a> tag string, with the href and element contents (link text) set by the parameters. We also call html_safe on the string to prevent Rails from escaping this string.
So let's try using our my_link_to method in our posts/show view now:
<!-- app/views/posts/show.html.erb -->
<!-- ... -->
<div class="post">
<!-- ... -->
</div>
<%= my_link_to 'Back to Posts', posts_path %>
<!-- generates... -->
<!-- <a href="/posts">Back to Posts</a> -->
This was a pretty simple helper method to start with, but through it we can clearly see that the purpose of helpers are to build HTML strings.