2016-11-05 9 views
0

У меня есть полиморфная модель, Comment, комментарий к Post или другой Comment (стиль reddit). Я хочу, чтобы пользователь мог непосредственно комментарий к сообщению с commentable_id из @post.id и commentable_type из @post.class.nameRails 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 

ответ

0

не могли бы вы передать свой комментарий или пост на локальный парциальное?

Для комментария на комментарий:

<%= render "shared/comment_form", locals: { commentable: @comment } %> 

Для комментариев по почте:

<%= render "shared/comment_form", locals: { commentable: @post } %> 

А потом в shared/_comment_form:

<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 => commentable.id %> 
    <%= f.hidden_field :commentable_type, :value => commentable.class.name %> 
    <br> 
    <%= f.submit class: "btn btn-primary" %> 
    <% end %> 
</div> 
<span id="add-comment">Add a comment</span> 

Я не совсем уверен, о пути там, у вас есть post_comments_path(@post), но комментарии к комментариям не будут иметь ct с сообщением, так что это не сработает. Возможно, вам придется изменить это в зависимости от маршрутизации.

+0

Это приближает меня. Я не знал, что вы можете проехать таких местных жителей. Можно ли добавить блок erb 'if', чтобы решить, какую строку' form_for' пройти в зависимости от имени локального? Разве это нарушит форму, или я полностью отсюда? – Antonio

+0

Кроме того, я обновил свое оригинальное сообщение с помощью соответствующих маршрутов. – Antonio

+0

Проблема в том, что на ваших маршрутах у вас есть комментарии, вложенные в сообщения, но это предполагает, что каждый комментарий связан с сообщением, что не подходит для комментариев комментариев, правильно? Можете ли вы показать свой 'PostsController'? –