Комментарии Micropost на странице пользователей (Ruby on Rails) - PullRequest
2 голосов
/ 12 марта 2012

На странице пользователя у меня много микросообщений, и я хочу добавить форму комментария и комментарии к каждому микросообщению.

У меня есть три модели: Пользователь, Микросообщение, Комментарий.

пользователь.rb

class User < ActiveRecord::Base
  has_many :microposts, dependent: :destroy
  has_many :comments
end

micropost.rb

class Micropost < ActiveRecord::Base
  belongs_to :user
  has_many :comments, dependent: :destroy
end

comment.rb

class Comment < ActiveRecord::Base
  attr_accessible :comment_content

  belongs_to :user
  belongs_to :micropost

  validates :comment_content, presence: true
  validates :user_id, presence: true
  validates :micropost_id, presence: true  
end

comments_controller.rb

class CommentsController < ApplicationController

  def create
    @comment = current_user.comments.build(params[:comment])
    if @comment.save
       flash[:success] = "Comment created!"
       redirect_to current_user
    else
      render 'shared/_comment_form'
    end
  end
end

_micropost.html.erb

<tr>
  <td class="micropost">
    <span class="content"><%= wrap(micropost.content) %></span>
    <span class="timestamp">
      Posted <%= time_ago_in_words(micropost.created_at) %> ago.    
    </span>
    <%= render 'shared/comment_form' %>
   </td>
</tr>

Форма комментария

<%= form_for(@comment) do |f| %>
<%= render 'shared/error_messages', object: f.object %>
  <div class="field">
    <%= f.text_area :comment_content %>
  </div>
  <button class="btn" type="submit">
    Create
  </button>
<% end %>

Каждый микросообщение должно иметь свои комментарии.В моей БД у меня есть таблица комментариев с

id / comment_content / user_id / micropost_id

столбцов.

Комментарий не создается, потому что RoR не можетпонять, к какому микропосту принадлежит этот новый комментарий.Что я должен сделать, чтобы иметь всю необходимую информацию в моей БД?

ОБНОВЛЕНИЕ

users_controller

  def show
    @user = User.find(params[:id])
    @microposts = @user.microposts.paginate(page: params[:page])
    @comment = Comment.new
  end

microposts_controller

  def create
    @micropost = current_user.microposts.build(params[:micropost])
    if @micropost.save
      flash[:success] = "Micropost created!"
      redirect_to current_user
    else
      render 'shared/_micropost_form'
    end
  end

РЕШЕНИЕ !!!

Большое спасибо Карлосрамирезиии и Джону!Они оба правы

comments_controller

  def create
    @micropost = Micropost.find(params[:micropost_id])
    @comment = Comment.new(params[:comment])
    @comment.micropost = @micropost
    @comment.user = current_user
    if @comment.save
       flash[:success] = "Comment created!"
       redirect_to current_user
    else
      render 'shared/_comment_form'
    end
  end

_micropost.html.erb

<%= render 'shared/comment_form', micropost: micropost %>

Комментарийформа

<%= form_for([micropost, @comment]) do |f| %>

rout.rb

resources :microposts do
  resources :comments
end

Ответы [ 2 ]

0 голосов
/ 12 марта 2012

Попробуйте передать текущий микросообщение частичному комментарию

<%= render 'shared/comment_form', micropost: micropost %>

Затем добавьте микропост к комментарию form_for вызов

<%= form_for([micropost, @comment]) do |f| %>

Убедитесь, что ваши маршруты вложены

# in routes.rb
resources :microposts do
  resources :comments
end

Затем создайте комментарий на микросообщении в CommentsController

def create
  @micropost = Micropost.find(params[:micropost_id])
  @comment = @micropost.comments.build(params[:comment])
  ...
end
0 голосов
/ 12 марта 2012

Я бы использовал вложенные ресурсы для микросообщений и комментариев, подобных этому, в вашем файле rout.rb:

resources :microposts do
  resources :comments
end

Затем в контроллере комментариев, к которому вы обращаетесь через micropost_comments_path(@micropost) url helper, вы можете сделать следующее для построения ассоциации в действии create:

def create
  @micropost = Micropost.find(params[:micropost_id])
  @comment = Comment.new(params[:comment])
  @comment.micropost = @micropost
  @comment.user = current_user

  if @comment.save
    ...
end

Вы можете уменьшить количество строк кода, используя метод слияния, но я считаю, что это иногда снижает читабельность вашего кода, и, поскольку вам понадобится объект @micropost, если при повторном отображении формы после ошибок проверки вы можете ну просто возьми запись.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...