2010-11-02 12 views
5

Ho un modello che voglio essere commentabile. Ho difficoltà a creare un modulo sulla vista "show" del mio modello che consentirà la creazione di commenti. Non sto trovando esempi validi o utili. Qualcuno può indicarmi o mostrarmi un esempio su come farlo?act_as_commentable esempi?

Esempio:

Una semplice applicazione blog. Ho un modello chiamato Post. È commentabile. Quindi nella vista 'show' voglio mostrare un post e, in basso, avere i campi che, una volta completati e inviati, creano un nuovo commento associato al post e lo inserisce nel database.

I suoni sono semplici e ho funzionato in modo da poter visualizzare i commenti che ho seminato. Non riesco a trovare un modulo in cui lavorare per inserirne di nuovi. Qualsiasi aiuto è apprezzato.

+1

Questo http://www.arailsdemo.com/posts/16 potrebbe essere d'aiuto. – monocle

risposta

3

Questo è molto, molto di base e hai chiaramente bisogno di una struttura e un approccio migliori per il tuo apprendimento. L'acquisto di un libro, come ad esempio Agile Web Development with Rails, è l'unico vero modo per imparare, altrimenti ti aggirerai da un problema all'altro senza neanche imparare veramente bene.

Dire di avere un post che si desidera commentare.

#routes.rb 
map.resources :posts do |post| 
    post.resources :comments 
end 

#post_controller.rb 
def show 
    @post.find params[:id] 
    @comment = @post.comments.new 
end 

#posts/show.html.erb 
<%- form_for [@post, @comment] do |f|-%> 
    <%= f.text_area :body -%> 
    <%= f.submit -%> 
<%- end -%> 

#comments_controller 
def create 
    @post = @post.find params[:post_id] 
    @comment = @post.comments.new params[:comment] 
    if @comment.save 
    redirect_to @post 
+0

Apprezzo le informazioni e le tue critiche. Guarderò quel libro. Suppongo che quello che mi ha fatto buttare fuori di qui era che stavo usando un modello con la vista spettacolo di un altro. Immagino che non sia così difficile come pensavo che fosse. Grazie ancora. –

+0

Penso di esserci quasi ma il percorso si sta rompendo. In che modo la dichiarazione map.resources si tradurrà nel modo di instradamento di Rails 3? I cambiamenti in Rails 3 sono molti di quelli che mi danno problemi. –

+0

Ho ottenuto questo lavorando ottenendo le informazioni di routing corrette. –

27

Assumiamo un modello Post. Assicurarsi, avete

class Post < ActiveRecord::Base 
acts_as_commentable 
end 

poi nella vista di dire sul post # mostrano

<%= form_tag "/posts/add_new_comment" do %> 
    <%= hidden_field_tag "id", post.id %> 
    <%= text_area_tag "comment[comment]" %> 
    <%= submit_tag "Post Comment" %> 
    <% end %> 

poi nel PostController

def add_new_comment 
    post = Post.find(params[:id]) 
    post.comments << Post.new(params[:comment]) 
    redirect_to :action => :show, :id => post 
    end 

e in routes.rb

match "/posts/add_new_comment" => "posts#add_new_comment", :as => "add_new_comment_to_posts", :via => [:post] 

Spero che questo sia pronto e funzionante.

+10

Una grande risposta senza lo snark (come visto sopra). Molto apprezzato. – daspianist

+1

d'accordo, nessun punto per lo snark. questa risposta dovrebbe essere svalutata – echan00

+1

Nel codice del controller, il "Post.new" non dovrebbe essere "Comment.new" invece ?? – miguelfg

1

Questa è una vecchia questione, ma voglio gettare la mia soluzione, così come README della gemma è ancora inutile dopo tutti questi anni. Si basa sulla risposta di @ Kunday. Quello che segue sarà un tutorial per usare la gemma act_as_commentable per ...

  1. Permettere agli utenti di creare commenti sotto ogni post.
  2. Mostra tutti i commenti appartenenti a un post.

Questo presuppone che tu abbia già un "blog" funzionante, che si tratti di foto o post. Installa gem, quindi avvia rails g comment per iniziare.

Permettere agli utenti di creare commenti sotto ogni post.

Per prima cosa, all'interno del modello che si desidera utilizzare una gemma commentabile, aggiungere la seguente riga come suggerito nel README della gemma.

class Post < ActiveRecord::Base 
    acts_as_commentable 
end 

quindi creare un nuovo commento controller con l'azione create. Si prega di notare che lo :authenticate_user! fa parte del progetto che è un gioiello per la creazione di una facile autenticazione. current_user è anche parte di idea come aiutante.È necessario se si desidera visualizzare il nome/l'e-mail dell'utente sotto il corpo del commento.

class CommentsController < ApplicationController 
    before_action :authenticate_user! 

    def create 
    post = Post.find_by(id: params[:id]) 
    comment = post.comments.build(comment_params) 
    comment.user = current_user 

    if comment.save 
     flash[:notice] = "Comment has been created." 
     redirect_to post 
    else 
     flash[:alert] = "Comment has not been created." 
    end 
    end 

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

Successivamente, impostare i percorsi. È solo questo. Ciò significa che quando qualcuno invia una richiesta di post ai commenti, eseguiremo per creare un'azione all'interno del controller dei commenti.

post 'comments' => 'comments#create', as: "create_comment" 

Il as: "create_comment" dà un alias, in modo da poter fare create_comment_path. Ora, nella visualizzazione dello spettacolo di Post, aggiungeremo il modulo. I div ti aiuteranno ad aggiungere css.

<div class="comment-section"> 
    <%= form_tag create_comment_path, method: "post" do %> 
    <%= hidden_field_tag "id", @post.id %> 
     <%= text_area_tag :comment %> 
     <%= submit_tag "Submit" %> 
    <% end %> 
</div> 

Ora per mostrare ogni commento sotto lo show view post.

I div consentono di aggiungere css, comment.user.name funzionerà se la classe utente ha una colonna del nome. Altrimenti, sostituirlo con email o con qualsiasi altro identificativo che si sceglie di utilizzare.

<div class="comment_list"> 
    <% @comments.each do |comment| %> 
    <%= comment.comment %> <br> 
     <%= comment.user.name %> <br> 
     <br> 
    <% end %> 
</div> 

E, infine, perché @comments di esistere nella pagina spettacolo, andare al controller Post, e sotto esposizione, aggiungere il seguente:

def show 
    @post = Post.find_by(id: params[:id]) 
    @comments = @post.comments.all 
    end 

Questo dovrebbe essere un bene per le esigenze . In bocca al lupo.