У меня есть полиморфная модель, Comment
, комментарий к Post
или другой Comment
(стиль reddit). Я хочу, чтобы пользователь мог непосредственно комментарий к сообщению с commentable_id
из @post.id
и commentable_type
из @post.class.name
Rails 5: две формы для одной полиморфной модели на одном виде
ИЛИ
иметь возможность комментировать другой комментарий на той же странице, однако, используя @comment.id
и @comment.class.name
Есть ли способ динамически менять между @post
или @comment
в зависимости от формы?
Вот информация, которая, я думаю, может помочь.
Моя форма
# shared/_comment_form.html.erb
<div id="comment-form" class="form-group">
<%= form_for @comment, remote: true, url: post_comments_path(@post) do |f| %>
<%= f.text_area :body, required: true, rows: 5, class: "form-control" %>
<%= f.hidden_field :commentable_id, :value => @post.id %>
<%= f.hidden_field :commentable_type, :value => @post.class.name %>
<br>
<%= f.submit class: "btn btn-primary" %>
<% end %>
</div>
<span id="add-comment">Add a comment</span>
И мой взгляд
# show.html.erb for a Post
<p id="notice"><%= notice %></p>
<h2>Post:</h2>
<div class="well">
<p>
<strong>Title:</strong>
<%= @post.title %>
</p>
<% if @post.description %>
<p>
<strong>Description:</strong>
<%= @post.description %>
</p>
<% end %>
</div>
<%= render "shared/comment_form" %>
<% if @post.comments.any? %>
<%= render "shared/comment_list" %> # Inside of this partial will be another comment form for the a comment.
<% else %>
<p>No comments yet</p>
<% end %>
Внутри comment_list
частичный будет другой частичной comment_form
# shared/_comment_list.html.erb
<h2>Comments</h2>
<ul>
<% @post.comments.each do |c| %>
<li><%= c.body %></li>
<%= render "shared/comment_form" %> # Here
<% end %>
</ul>
EDIT:
Я тоже добавляю свои маршруты.
# Applicable routes
resources :forums do
resources :posts, shallow: true do
resources :comments, shallow: true
end
end
И:
post_comments GET /posts/:post_id/comments(.:format) comments#index
POST /posts/:post_id/comments(.:format) comments#create
new_post_comment GET /posts/:post_id/comments/new(.:format) comments#new
edit_comment GET /comments/:id/edit(.:format) comments#edit
comment GET /comments/:id(.:format) comments#show
PATCH /comments/:id(.:format) comments#update
PUT /comments/:id(.:format) comments#update
DELETE /comments/:id(.:format) comments#destroy
forum_posts GET /forums/:forum_id/posts(.:format) posts#index
POST /forums/:forum_id/posts(.:format) posts#create
new_forum_post GET /forums/:forum_id/posts/new(.:format) posts#new
edit_post GET /posts/:id/edit(.:format) posts#edit
post GET /posts/:id(.:format) posts#show
PATCH /posts/:id(.:format) posts#update
PUT /posts/:id(.:format) posts#update
DELETE /posts/:id(.:format) posts#destroy
forums GET /forums(.:format) forums#index
POST /forums(.:format) forums#create
new_forum GET /forums/new(.:format) forums#new
edit_forum GET /forums/:id/edit(.:format) forums#edit
forum GET /forums/:id(.:format) forums#show
PATCH /forums/:id(.:format) forums#update
PUT /forums/:id(.:format) forums#update
DELETE /forums/:id(.:format) forums#destroy
Это приближает меня. Я не знал, что вы можете проехать таких местных жителей. Можно ли добавить блок erb 'if', чтобы решить, какую строку' form_for' пройти в зависимости от имени локального? Разве это нарушит форму, или я полностью отсюда? – Antonio
Кроме того, я обновил свое оригинальное сообщение с помощью соответствующих маршрутов. – Antonio
Проблема в том, что на ваших маршрутах у вас есть комментарии, вложенные в сообщения, но это предполагает, что каждый комментарий связан с сообщением, что не подходит для комментариев комментариев, правильно? Можете ли вы показать свой 'PostsController'? –