2012-01-15 6 views
9

Faccio un semplice blog su binari. Ho un modello di post e un modello di commento. Quando si crea un commento, se il commento non è valido, voglio mostrare l'errore. Come faccio?Passa una variabile dal controller per visualizzare

modello Post:

#/models/post.rb 
class Post < ActiveRecord::Base 
    has_many :comments 
    validates :title, :content, :presence => true 
end 

modello Commento:

#/models/comment.rb 
class Comment < ActiveRecord::Base 
    belongs_to :post 
    validates :name, :comment, :presence => true 
end 

Commenti controller

class CommentsController < ApplicationController 
    def create 
    @post = Post.find(params[:post_id]) 
    @comment = @post.comments.create(params[:comment]) 
    redirect_to post_path(@post) 
    end 
end 

View per un commento forma:

/views/comments/_form.html .erb

<%= form_for([@post, @post.comments.build]) do |f| %> 
    <% if @comment.errors.any? %> 
    error! 
    <% end %> 
    <div class="field"> 
    <%= f.label :name %><br /> 
    <%= f.text_field :name %> 
    </div> 
    <div class="field"> 
    <%= f.label :comment %><br /> 
    <%= f.text_area :comment %> 
    </div> 
    <div class="actions"> 
    <%= f.submit %> 
    </div> 
<% end %> 

/views/posts/show.html.erb

<%= render 'comments/form' %> 

Come passare @comment dal CommentController controller per visualizzare /post/show.html.erb?

Grazie in anticipo.

+0

Non 'post.comments', dove hai tutti i commenti del post, incluso quello appena creato, è sufficiente? – clyfe

risposta

5

Put render "posts/show" anziché redirect_to post_path(@post) nel CommentsController.

+0

così semplice! Grazie. – Mike

+0

Benvenuto. Qui ho appena considerato il tuo problema di non essere in grado di passare una variabile di istanza di un controller a una vista. Dai un'occhiata alla risposta di Vapire, devi assolutamente dichiarare la risorsa nidificata per la relazione Post-Commenti. – shime

+0

hai in mente in routes.rb? risorse: pubblicare risorse: commenti fine. – Mike

2
1

non devono rimandare post_path(@post)se il commento non è valido.

class CommentsController < ApplicationController 
    def create 
    @post = Post.find(params[:post_id]) 
    @comment = @post.comments.new(params[:comment]) 

    if @comment.save 
     redirect_to post_path(@post), notice: 'Comment was successfully created.' 
    else 
     render action: "posts/show", error: 'The comment you typed was invalid.' 
    end 
    end 
end 

e cambiare la prima linea forma in /views/comments/_form.html.erb da:

<%= form_for([@post, @post.comments.build]) do |f| %> 

a:

<%= form_for([@post, (@comment || @post.comments.build)]) do |f| %> 

allora si dovrebbe vedere i messaggi di errore quando non riesce a risparmiare.