Ассоциация Rails (own_to, has_many) не может сохранить 2 идентификатора в таблице с помощью метода create (пользователь, публикация, комментарий) - PullRequest
1 голос
/ 17 сентября 2010

Пытаясь написать базовое «блогоподобное» приложение в rails 3, я застрял в ассоциациях.Мне нужно, чтобы метод create сохранил post_id, а также user_id в таблице комментариев (которая мне нужна, чтобы получить все комментарии, написанные пользователем, чтобы отобразить его)

Приложение имеет пользователей (аутентификация -devise), сообщения (опубликованные пользователями - но я не уверен, что это имеет значение в моем случае) и комментарии (к сообщениям, опубликованным пользователями).

таблица комментариев имеет post_id, тело итакже user_id

Связи:

has_many :comments (In the Post model)
belongs_to :post (In the Comment model)
belongs_to :user (In the Comment model)
has_many :comments (In the User model)

маршруты:

resources :posts do
  resources :comments
end

resources :users do
  resources :comments
end

Форма поста комментария, отображаемая в постах, показывает представление: (posts / show.html.erb)

<% form_for [@post, Comment.new] do |f| %>
  <%= f.label :body %>
  <%= f.text_area :body %>
  <%= f.submit %>
<% end %>

и, наконец, метод create в контроллере комментариев:

A.) Если я пишу это, post_id записывается в базу данных

def create
  @post = Post.find(params[:post_id])
  @comment = @post.comments.create!(params[:comment])
  redirect_to @post
end

B.) Если я пишу это, user_id пишется ...

def create
  @user = current_user
  @comment = @user.comments.create!(params[:comment])
  redirect_to @post
end

Я пытался:

@comment = @post.comments.create!(params[:comment].merge(:user => current_user))

Но это не работает .. Как я могу написать методкоторые сохраняют user_id и post_id?Нужно ли было также вносить некоторые изменения в форму комментария (что-то вроде <% form_for [@post, @user, Comment.new] do | f |%>?)

Спасибо!

1 Ответ

4 голосов
/ 17 сентября 2010

Чтобы настроить что-то очень похожее, я использовал следующую форму:

<%= form_for [:place, @comment] do |f| %>
  #form fields here
<%= end %>

Затем в контроллере комментариев:

def create
  @post = Post.find(params[:post_id])
  @comment = @post.comments.build(params[:comment])
  @comment.user = User.find(current_user.id)

  respond_to do |format|
  if @comment.save
    format.html { redirect_to(@comment.post, :notice => 'Comment was successfully created.') }
  else
    format.html { render :action => "new" }
  end
end

end

ThatНадо надеяться на правильное построение ассоциаций!Кроме того, вы подразумеваете, что комментарии будут вложены в: пользователи в ваших маршрутах?Если вы просто хотите отобразить все комментарии пользователя на странице профиля, вы можете сделать что-то вроде:

<p>
  <b>Comments</b>
  <% if @user.comments.empty? %>
    No comments to display yet...
  <% else %>
    <% @user.comments.each do |comment| %>
      <p>
      <%= link_to "#{comment.post.title}", post_path(comment.post_id) %>, <%= comment.created_at %>
      <%= simple_format comment.content %>
      </p>
    <% end %>
  <% end %>
</p>

Надеюсь, что это поможет!

...