Ассоциации рельсов (принадлежат_то, has_many) не могут сохранить 2 идентификатора в таблице с методом создания (пользователь, сообщение, комментарий)
-
03-10-2019 - |
Вопрос
Попытка написать базовое «блог-подобное» приложение в рельсах 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>
Надеюсь, что некоторые из них помогают!