Как передать несколько значений в действие создания в Rails?

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