KnowledgeMC KnowledgeMC - 1 month ago 8
Ruby Question

Correct Rails path to put in Embedded Ruby File for the view?

I'm building my first Rails app and I'm having trouble placing the correct path for a link in my embedded ruby file.

I want to link to a "Add new comment" page from a post. I want the user to be redirected for example to "http://localhost:3000/posts/1/comments/new" when they click the "Comment" link on the page. I think the nested routes are confusing me. Can someone help me out?

Here are my routes:

Prefix Verb URI Pattern Controller#Action
sessions_new GET /sessions/new(.:format) sessions#new
users_new GET /users/new(.:format) users#new
root GET / pages#home
help GET /help(.:format) pages#help
about GET /about(.:format) pages#about
contact GET /contact(.:format) pages#contact
signup GET /signup(.:format) users#new
login GET /login(.:format) sessions#new
POST /login(.:format) sessions#create
logout DELETE /logout(.:format) sessions#destroy
users GET /users(.:format) users#index
POST /users(.:format) users#create
new_user GET /users/new(.:format) users#new
edit_user GET /users/:id/edit(.:format) users#edit
user GET /users/:id(.:format) users#show
PATCH /users/:id(.:format) users#update
PUT /users/:id(.:format) users#update
DELETE /users/:id(.:format) users#destroy
post_comments POST /posts/:post_id/comments(.:format) comments#create
new_post_comment GET /posts/:post_id/comments/new(.:format) comments#new
post_comment DELETE /posts/:post_id/comments/:id(.:format) comments#destroy
posts GET /posts(.:format) posts#index
POST /posts(.:format) posts#create
new_post GET /posts/new(.:format) posts#new
edit_post GET /posts/:id/edit(.:format) posts#edit
post GET /posts/:id(.:format) posts#show
PATCH /posts/:id(.:format) posts#update
PUT /posts/:id(.:format) posts#update
DELETE /posts/:id(.:format) posts#destroy


Here's the code for the view from the .erb file (I placed a '#' where the path should be:

<div class="col-md-8">
<% if @user.posts.any? %>
<h3>Posts (<%= @user.posts.count %>)</h3>
<ol class="posts">
<% @user.posts.each do |post| %>
<li id="post-<%= post.id %>">
<%= link_to gravatar_for(post.user, size: 50), post.user %>
<span class="user"><%= link_to post.user.name, post.user %></span>
<br>
<span class="picture" style="color:red;"><%= post.picture %></span>
<br>
<span class="picture"><%= image_tag post.picture.url(:large) %></span>
<br>
<br>
<span class="content"><%= post.caption %></span>
<span class="timestamp">
Posted <%= time_ago_in_words(post.created_at) %> ago.

<span class="edit_post">
<%= link_to "Edit", edit_post_path(@user, @post) %>
</span>
|
<span class="delete_post">
<%= link_to "Delete", post,
method: :delete, data:
{ confirm: "Are you sure you want to delete this post?"} %>
</span>


<span class="comment_post">
<%= link_to "Comment", '#' %>
</span>

</span>
</li>
<% end %>
</ol>
<% end %>




Answer

This should map to your routing:

<%= link_to "Comment", new_post_comment_path(post_id: post.id) %>

and you can retrieve the post_id in your controller - params[:post_id]

Comments