#ruby-on-rails #view #controller #comments
#ruby-on-rails #Вид #контроллер #Комментарии
Вопрос:
В моем приложении у меня есть User
Post
и Comment
модели.
Когда a User
хочет прокомментировать Post
новое действие от Comments
контроллера, оно вступает во владение. Отображается Post
(для комментариев) и User
вводится его Comment
.
Однако, когда пользователь отправляет, я хочу передать Post.id и комментарии.содержимое к действию создания. Как мне это сделать?
Вот comments/new.html.erb
<%= form_for @comment do |f| %>
<%= render 'shared/error_messages', :object => f.object %>
<div class="field">
<%= f.text_area :comment %>
</div>
<div class="actions">
<%= f.submit "Done" %>
</div>
<% end %>
Спасибо всем вам. Я выполнил вложенную маршрутизацию, и мой новый.html.erb теперь имеет
<%= form_for [@post,@comment] do |f| %>
<%= render 'shared/error_messages', :object => f.object %>
<% f.hidden_field :post %>
<div class="field">
<%= f.text_area :comment %>
</div>
<div class="actions">
<%= f.submit "Done" %>
</div>
<% end %>
Однако я получаю: неопределенный метод `комментарий», и я не могу понять, что это за ошибка.
Ответ №1:
Я предполагаю, что каждое Comment
из них должно принадлежать a Post
, если это так, то это кажется идеальным кандидатом для вложенных маршрутов. http://guides.rubyonrails.org/routing.html#nested-resources
resources :posts do
resources :comments
end
Итак, в вашем случае и идентификатор записи, и идентификатор комментария будут частью URL-адреса:
# Will submit to a URL like /posts/1/comments
# or /posts/1/comments/1
<%= form_for [@post,@comment] do |f| %>
<%= render 'shared/error_messages', :object => f.object %>
<div class="field">
<%= f.text_area :comment %>
</div>
<div class="actions">
<%= f.submit "Done" %>
</div>
<% end %>
Вам нужно будет обработать post_id в ваших действиях контроллера комментариев.
Ответ №2:
Прежде всего, вы должны перейти Post.id
к новому действию comments. Что-то вроде
link_to "Add comment", new_comment_path( params[ :id ] )
Я предполагаю, что вы следуете соглашениям, так params[ :id ]
и есть Post.id
. Позже в вашем Comment#create
экземпляре нового комментария с
@comment = Comment.new( :post_id => params[ :id ] )
который создаст комментарий, связанный с сообщением. Наконец, форма для нового комментария
<%= form_for @comment do |f| %>
<%= render 'shared/error_messages', :object => f.object %>
<%= f.hidden_field :post_id %>
<div class="field">
<%= f.text_area :comment %>
</div>
<div class="actions">
<%= f.submit "Done" %>
</div>
<% end %>
Ответ №3:
В представлении (с использованием HAML)
=form_for( @comment, :as => :comment) do |f|
=f.hidden_field :post_id
=f.hidden_field :user_id
=f.text_area :comment
=f.submit "Submit"
и в комментарии#новый контроллер:
@comment = Comment.new(:user_id => @user.id, :post_id => @post.id)