Передайте переменную из контроллера для просмотра

127
3

Я делаю простой блог на рельсах.
У меня есть модель Post и модель комментариев.
Когда вы создаете комментарий, если комментарий недопустим, я хочу показать ошибку.
Как мне сделать?


model Post:


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

Комментарий модели:


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

Контроллер комментариев


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

Просмотр формы комментария:


/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' %>

Как передать @comment с контроллера CommentController для просмотра /post/show.html.erb?


Спасибо заранее.

спросил(а) 2012-01-15T16:54:00+04:00 8 лет, 9 месяцев назад
1
Решение
100

Поместите render "posts/show" вместо redirect_to post_path(@post) в CommentsController.

ответил(а) 2012-01-15T17:06:00+04:00 8 лет, 9 месяцев назад
70

И/Или взгляните на Райана Бейтса Screencasts о вложенных моделях и ресурсах:

Они Rails 2, но чтобы понять, как это работает.

Возможно, вам также интересно:


ответил(а) 2012-01-15T17:07:00+04:00 8 лет, 9 месяцев назад
58

вы не должны перенаправлять на post_path(@post) , если комментарий недействителен.


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


и измените первую строку формы в /views/comments/_form.html.erb на:


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

в


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

тогда вы должны увидеть сообщения об ошибках, когда он не сможет сохранить.

ответил(а) 2012-01-15T17:15:00+04:00 8 лет, 9 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема