ruby-on-rails - scaffold ruby on rails
Error de "variable o método local indefinido" al usar gema commontator para comentarios (2)
Como no hay stacktrace agregado, un par de observaciones.
acts_as_commontator
yacts_as_commontable
se agregan en el mismo modelo.Según la documentación en https://github.com/lml/commontator
-
acts_as_commontator
// para ser agregado en modelo (s) de usuario (o cualquier modelo que debería poder publicar comentarios) acts_as_commontable
// para agregar en los modelos que quieras poder comentarEntonces, ¿puedes intentar mover
acts_as_commontator
al modelo de usuario?
-
En la línea
pin.rb
no. 3, .remove la líneaacts_as_commentable
que no es utilizada por tu gem commontator
Hice un sitio web en el que las personas pueden compartir fotos (se llaman pines en mi código). Quería agregar un sistema en el que, cuando alguien hace clic en la imagen, puedan comentarlo. Decidí usar la gema de Commontator y lo instalé. Mi problema es que el sistema de comentarios no aparece debajo de las publicaciones como se supone y obtengo una variable local indefinida o un error de método para mi controlador de pins.
routes.rb
Photo::Application.routes.draw do
resources :pins
devise_for :users
root "pins#index"
get "about" => "pages#about"
mount Commontator::Engine => ''/commontator''
show.html.erb
<%= link_to ''Back'', pins_path %>
<div class="row">
<div class="col-md-offset-2 col-md-8">
<div class="panel panel-default">
<div class="panel-heading center">
<%= image_tag @pin.image.url(:medium) %>
</div>
<div class="panel-body">
<p><%= @pin.description %></p>
<p><strong><%= @pin.user.name if @pin.user %></strong></p>
<%= commontator_thread(commontable) %>
<% if @pin.user == current_user %>
<%= link_to edit_pin_path(@pin) do %>
<span class="glyphicon glyphicon-edit"></span>
<% end %>
<% end %>
</div>
</div>
</div>
pin.rb
class Pin < ActiveRecord::Base
belongs_to :user
acts_as_commentable
has_attached_file :image, :styles => { :medium => "300x300>", :thumb => "100x100>" }
validates :image, presence: true
acts_as_commontator
acts_as_commontable
end
pins_controller.rb
class PinsController < ApplicationController
before_action :set_pin, only: [:show, :edit, :update, :destroy]
before_action :correct_user, only: [:edit, :update, :destroy]
before_action :authenticate_user!, except: [:index, :show]
def index
@pins = Pin.all.order("created_at DESC").paginate(:page => params[:page], :per_page => 8)
end
def show
end
def new
@pin = current_user.pins.build
end
def edit
end
def create
@pin = current_user.pins.build(pin_params)
if @pin.save
redirect_to @pin, notice: ''Pin was successfully created.''
else
render action: ''new''
end
end
def update
if @pin.update(pin_params)
redirect_to @pin, notice: ''Pin was successfully updated.''
else
render action: ''edit''
end
end
def destroy
@pin.destroy
redirect_to pins_url
end
private
# Use callbacks to share common setup or constraints between actions.
def set_pin
@pin = Pin.find(params[:id])
end
def correct_user
@pin = current_user.pins.find_by(id: params[:id])
redirect_to pins_path, notice: "Not authorized to edit this pin" if @pin.nil?
end
def pin_params
params.require(:pin).permit(:description, :image)
end
end
Usuario modelo user.rb
class User < ActiveRecord::Base
# Include default devise modules. Others available are:
# :token_authenticatable, :confirmable,
# :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
has_many :pins, dependent: :destroy
validates :name, presence: true
acts_as_commontator
end
error Me estoy poniendo en show.html.erb
NameError in Pins#show
undefined local variable or method `commontable'' for #<#<Class:0x007f9d8ccec328>:0x007f9d8df68768>
Extracted source (around line #12):
<div class="panel-body">
<p><%= @pin.description %></p>
<p><strong><%= @pin.user.name if @pin.user %></strong></p>
**<%= commontator_thread(commontable) %>**
<% if @pin.user == current_user %>
<%= link_to edit_pin_path(@pin) do %>
Suponiendo que ha agregado acts_as_commontable
al modelo Pin
,
En los pins/show.html.erb
,
Reemplazar
<%= commontator_thread(commontable) %>
Con
<%= commontator_thread(@pin) %>
Según la Documentación de uso de Commontator ,
En <%= commontator_thread(commontable) %>
commontable
es una instancia de un modelo que acts_as_commontable
.
que en tu caso es @pin
.