Ask A Question

Notifications

You’re not receiving notifications from this thread.

how do i link a comment to a specific post...

khemlall mangal asked in Rails

Can someone give me an example of POST and Comment.. i did a scaffold of a blog for example but i am not sure how to integrate the part where you can link a comment to a specific post....

COMMENTS controller
class CommentonsquealsController < ApplicationController
before_action :set_commentonsqueal, only: [:show, :edit, :update, :destroy]

# GET /commentonsqueals
# GET /commentonsqueals.json
def index
@commentonsqueals = Commentonsqueal.all
@squeal = Squeal.all
end

# GET /commentonsqueals/1
# GET /commentonsqueals/1.json
def show
end

# GET /commentonsqueals/new
def new
@commentonsqueal = Commentonsqueal.new(Squeal.find_by_id(params[:id]))

end

# GET /commentonsqueals/1/edit
def edit
end

# POST /commentonsqueals
# POST /commentonsqueals.json
def create
@commentonsqueal = Commentonsqueal.new(commentonsqueal_params)

respond_to do |format|
  if @commentonsqueal.save
    format.html { redirect_to @commentonsqueal, notice: 'Commentonsqueal was successfully created.' }
    format.json { render :show, status: :created, location: @commentonsqueal }
  else
    format.html { render :new }
    format.json { render json: @commentonsqueal.errors, status: :unprocessable_entity }
  end
end

end

# PATCH/PUT /commentonsqueals/1
# PATCH/PUT /commentonsqueals/1.json
def update
respond_to do |format|
if @commentonsqueal.update(commentonsqueal_params)
format.html { redirect_to @commentonsqueal, notice: 'Commentonsqueal was successfully updated.' }
format.json { render :show, status: :ok, location: @commentonsqueal }
else
format.html { render :edit }
format.json { render json: @commentonsqueal.errors, status: :unprocessable_entity }
end
end
end

# DELETE /commentonsqueals/1
# DELETE /commentonsqueals/1.json
def destroy
@commentonsqueal.destroy
respond_to do |format|
format.html { redirect_to commentonsqueals_url, notice: 'Commentonsqueal was successfully destroyed.' }
format.json { head :no_content }
end
end

private
# Use callbacks to share common setup or constraints between actions.
def set_commentonsqueal
@commentonsqueal = Commentonsqueal.find(params[:id])
end

# Never trust parameters from the scary internet, only allow the white list through.
def commentonsqueal_params
  params.require(:commentonsqueal).permit(:squeal_id, :body)
end

end
class SquealsController < ApplicationController
before_action :set_squeal, only: [:show, :edit, :update, :destroy]

# GET /squeals
# GET /squeals.json
def index
@squeals = Squeal.all
@commentonsqueals = Commentonsqueal.all
end

# GET /squeals/1
# GET /squeals/1.json
def show
@comments = Commentonsqueal.all.where("squeal_id = ?", Squeal.find_by_id(params[:id]))
end

# GET /squeals/new
def new
@squeal = Squeal.new

end

# GET /squeals/1/edit
def edit
end

# POST /squeals
# POST /squeals.json
def create

@squeal = Squeal.new(squeal_params)

respond_to do |format|
  if @squeal.save
    format.html { redirect_to @squeal, notice: 'Squeal was successfully created.' }
    format.json { render :show, status: :created, location: @squeal }
  else
    format.html { render :new }
    format.json { render json: @squeal.errors, status: :unprocessable_entity }
  end
end

end

# PATCH/PUT /squeals/1
# PATCH/PUT /squeals/1.json
def update
respond_to do |format|
if @squeal.update(squeal_params)
format.html { redirect_to @squeal, notice: 'Squeal was successfully updated.' }
format.json { render :show, status: :ok, location: @squeal }
else
format.html { render :edit }
format.json { render json: @squeal.errors, status: :unprocessable_entity }
end
end
end

# DELETE /squeals/1
# DELETE /squeals/1.json
def destroy
@squeal.destroy
respond_to do |format|
format.html { redirect_to squeals_url, notice: 'Squeal was successfully destroyed.' }
format.json { head :no_content }
end
end

private
# Use callbacks to share common setup or constraints between actions.
def set_squeal
@squeal = Squeal.find(params[:id])
end

# Never trust parameters from the scary internet, only allow the white list through.
def squeal_params
  params.require(:squeal).permit(:title, :body)
end

end

Reply

Hi Thank you, i followed this tutorial however i am getting
Routing Error
uninitialized constant Squeals

Rails.root: /home/ubuntu/workspace

Application Trace | Framework Trace | Full Trace

here is my routes.rb:
Rails.application.routes.draw do

resources :commentonsqueals
resources :squeals do
resources :comments, module: :squeals

end

get 'squeals/index'
resources :campaign
devise_for :users
resources :users do
get "users/show_image" => "users#show_image"
member do
get :following, :followers
end
end
resources :relationships, only: [:create, :destroy]
resources :posts, only:[:create,:destroy]
# Define Root URL
root 'pages#index'

# Define Routes for Pages
get '/home' => 'pages#home' # override default routes.
get '/user/:id' => 'pages#profile'
get '/explore' => 'pages#explore'
put 'posts/:id', to: 'posts#update'
get 'posts/:id/edit', to: 'posts#edit', as: :edit_post
get '/signup' => 'pages#signup'
get '/show' => 'pages#show'
get 'show/:id' => 'pages#show'

get '/campaign' => 'campaign#index'
get 'dashboard'=>'pages#dashboard'

squeal RB file

class Squeal < ActiveRecord::Base
has_many :comments, as: :commentable

end

COMMENTS.RB FILE

class Comment < ActiveRecord::Base
belongs_to:commentable, polymorphic:true
end

Comments-> Comments.html.erb
Comments-> _form.html.erb

squeal->comments_controller
class Squeals::CommentsController <CommentsController
before_action :set_commentable

private
def set_commentable

@commentable = Squeal.find(params[:id])

end

end

*comments controller
*

class CommentsController < ApplicationController
before_action:authenticate_user!

def create
@comment = @commentable.comments.new comment_params
@user.user = current_user
comment.save
redirect_to @commentable, notice: "Your comment was posted"
end

private
def comment_params
    params.require(:comment).permit(:body)
end

end

SQEALS-> show.html.erb

<%= notice %>

Title: <%= @squeal.title %> <%=%>

Body: <%= @squeal.body %>

<%= link_to 'Edit', edit_squeal_path(@squeal) %> |
<%= link_to 'Back', squeals_path %>

<%= render partial:"comments/comments",locals:{commentable:@squeal} %> <%= render partial:"comments/form",locals:{commentable:@squeal} %>

Comments

<% @squeal.comments.each do |comment|%> <%=comment.body%> <%end%>

_form.html.erb

<%= form_for(@squeal) do |f| %>

<% if @squeal.errors.any? %>


<%= pluralize(@squeal.errors.count, "error") %> prohibited this squeal from being saved:

  <ul>
  <% @squeal.errors.full_messages.each do |message| %>
    <li><%= message %></li>
  <% end %>
  </ul>
</div>

<% end %>


<%= f.label :title %>

<%= f.text_field :title %>


<%= f.label :body %>

<%= f.text_area :body %>


<%= f.submit %>

<% end %>

Reply

Thank you Jack..

Here is the Problem, when i click on Submit for a comment, i get uninitialized constants Squeals.

on my Squeal/Show.html.erb file where i show a specific or selected post
Url: https://squealing-app-squeldev.c9users.io/squeals/6
i enter my comments and clink on submit and then i am taking to URL https://squealing-app-squeldev.c9users.io/squeals/6/comments
With Error
uninitialized constant Squeals
Rails.root: /home/ubuntu/workspace
Application Trace | Framework Trace | Full Trace
Routes
SHOW.HTML.ERB FILE

<p id="notice"><%= notice %></p>

<p>
  <strong>Title:</strong>
  <%= @squeal.title %>
  <%=%>
</p>

<p>
  <strong>Body:</strong>
  <%= @squeal.body %>
</p>

<%= link_to 'Edit', edit_squeal_path(@squeal) %> |
<%= link_to 'Back', squeals_path %>



<div class="row">
  <div class="col-md-6 col-md-offset-3">
    <div class="well">
       <%= render partial:"comments/comments",locals:{commentable:@squeal} %>
       <%= render partial:"comments/form",locals:{commentable:@squeal} %>
      <h2>Comments</h2>

      <% @squeal.comments.each do |comment|%>

          <%=comment.body%>

      <%end%>

  </div>
</div>


Comments controller

class CommentsController < ApplicationController
    before_action:authenticate_user!

    def create
    @comment = @commentable.comments.new comment_params
    @user.user = current_user
    comment.save
    redirect_to @commentable, notice: "Your comment was posted"
    end

    private
    def comment_params
        params.require(:comment).permit(:body)
    end
end

file: squeal/comments_controller

class Squeals::CommentsController <CommentsController
before_action :set_commentable

private
def set_commentable

    @commentable = Squeal.find(params[:squeal_id])
end

end

Reply
Join the discussion
Create an account Log in

Want to stay up-to-date with Ruby on Rails?

Join 85,376+ developers who get early access to new tutorials, screencasts, articles, and more.

    We care about the protection of your data. Read our Privacy Policy.