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) %>
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.
Your questions are private and won't be used to evaluate your performance.
Your questions are private and won't be used to evaluate your performance.