2016-03-12 5 views
1

В моих взглядах у меня есть comments/_form.html.erb, и есть еще один вид контроллера для postposts/show.html. Я хочу отобразить comments/_form.html.erb в posts/show.html, в котором отображается отдельное сообщение и комментарии, связанные с этим сообщением, и все установлено и работает нормально.Оказание частичного от одного контроллера к другому ниже содержания

Я хочу предоставить вам возможность комментировать и сделать это частично ниже этих комментариев, чтобы мы могли прокомментировать одну и ту же страницу posts/show.html, а не перейти на страницу comments/new.html.erb. Я использую вложенные ресурсы, такие как:

resources :posts do 
    resources :comments 
end 

В моей comments/new.html.erb, я делаю это:

<%= form_for([:post, @comment]) do |f| %> 
    .... 
<% end %> 

Как я должен сделать его в моей posts/show.html.erb странице?

ответ

1

Javascript - это недостающая деталь в вашей головоломке. По сути, вы будете делать 3 вещи.

  1. Убедитесь, что форма использует JS представить (дистанционный)
  2. Убедитесь, что контроллер реагирует на входные данные Js
  3. Создать js.erb файл, который будет добавлять каждый новый комментарий

Замечания по реализации: Я бы, вероятно, сделал бы что-то вроде этого:

Добавьте форму в представление и добавьте элемент, который обтекает комментарии, в этом случае я использовал ul # c omments

# app/views/posts/show.html.erb 
<p> 
    <strong>Title:</strong> 
    <%= @post.title %> 
</p> 

<p> 
    <strong>Body:</strong> 
    <%= @post.body %> 
</p> 

<br/> 
<ul id="comments"> 
    <%= render @comments %> 
</ul> 
<%= form_for [@post, @new_comment], remote: true do |f| %> 
    <%= f.text_field :body %> 
    <%= f.submit %> 
<%end%> 

Добавить ответ Js в контроллере

# app/controllers/comments_controller.rb 
def create 
    @post = Post.find params[:post_id] 
    @comment = @post.comments.new(comment_params) 
    @new_comment = @post.comments.new(comment_params) 

    respond_to do |format| 
    if @comment.save 
     format.html { redirect_to [@post, @comment], notice: 'Comment was successfully created.' } 
     format.json { render :show, status: :created, location: @comment } 
     format.js 
    else 
     format.html { render :new } 
     format.json { render json: @comment.errors, status: :unprocessable_entity } 
    end 
    end 
end 

Затем добавить файл UJS, чтобы сделать изменения на лету (это делает 2 вещи, добавляет новый комментарий и опустошает форму).

# app/views/comments/create.js.erb 
$('#comments').append("<%= escape_javascript(render partial: '/comments/comment', locals: { comment: @comment }) %>"); 
$('form.new_comment').find("input#comment_body").val(''); 

также отметить ::

  • Я использую @new_comment так что нет никакого вмешательства, когда вы оказываете вновь созданный комментарий
  • Вам нужно добавить @new_comment в 2-х местах, первый в ваших сообщениях показать действие, а также в ваших комментариях создать действие
+0

Как получить доступ к переменной комментариев? Mine называется id, и я пробовал: id, @id, params [: id], locals [: id] , но ничего не работает. Любые идеи? –

+1

Если вы передаете id в секции locals частичного рендеринга, тогда он доступен как 'id' Ничего вокруг него и нет' @ ', потому что это не переменная экземпляра, его единственная локальная часть, которую вы передали ей к. (хотя я всегда предупреждал бы об использовании соглашения об именах «id»). Поскольку вы сказали, что попробовали это, вам может потребоваться опубликовать новый вопрос с образцами кода, чтобы вам было легче помочь. – trh

Смежные вопросы