Как передать несколько значений в действие создания в Rails? - PullRequest
0 голосов
/ 05 октября 2011

В моем приложении у меня есть модели User, Post и Comment.

Когда User хочет прокомментировать Post, вступает в силу новое действие от контроллера Comments. Post (для комментариев) отображается, и User входит в его Comment.

Однако, когда пользователь отправляет, я хочу передать Post.id и Comments.content в действие create. Как мне это сделать?

Вот это 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 %>

Спасибо всем вам. Я выполнил вложенную маршрутизацию, и мой new.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 %> 

Однако я получаю: undefined метод `comment ', и я не могу понять, что это за ошибка.

Ответы [ 3 ]

1 голос
/ 05 октября 2011

Я предполагаю, что каждый Comment должен принадлежать 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 в действиях контроллера комментариев.

0 голосов
/ 05 октября 2011

В представлении (с использованием 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)
0 голосов
/ 05 октября 2011

Прежде всего вы должны передать Post.id комментариям новое действие. Что-то вроде

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