Ассоциации рельсов (принадлежат_то, has_many) не могут сохранить 2 идентификатора в таблице с методом создания (пользователь, сообщение, комментарий)

StackOverflow https://stackoverflow.com/questions/3732198

Вопрос

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

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

Таблица комментариев имеет 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

Почта «Почта комментария» отображается на следующих постах: (поста / Show.html.erb)

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

И, наконец, метод создания в контроллере комментариев:

A.) Если я напишу эту запись_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 |%>?)

Спасибо!

Это было полезно?

Решение

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

<%= 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

конец

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

<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>

Надеюсь, что некоторые из них помогают!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top