2013-11-13 3 views
0

После завершения учебника Hartl я пытаюсь реализовать @replies для модели Micropost.Оказание частичного с AJAX link_to in Rails

Мне нужна кнопка ответа на микросоте, чтобы отобразить форму микропоты прямо под указанным сообщением a la twitter. Я также хотел передать: micropost_id указанного сообщения в ответ, чтобы позже я мог ссылаться на этот пост, на который был получен ответ, опять же ла-твиттер.

Я пытался реализовать некоторые из них на основе ответа на вопрос this question.

Мой microposts контроллер имеет

def reply_form 

    respond_to do |format| 
     format.js 
    end 
    end 

Связь с точки зрения является

<%= link_to 'reply', 'shared/reply_form', remote: true, locals: { object: :id } %> 

С моей попытки там пройти на micropost: ид

После поста я это для часть, подлежащая представлению в:

<div id="ReplyContainer"></div> 

Я тогда _reply_form.js.erb

$('#ReplyContainer').html('<%=j render partial: 'shared/reply_form', locals: { object: :id } %>') 

Это не бросали ошибки, но нажав на ссылку «Ответить» не имеет никакого эффекта и не оказывает _reply_form.html.erb частично.

Моя конечная цель - щелкнуть ответ, который отображает форму микросоты, с именем @username в начале сообщения (полученным из micropost_id?), Представляющим эту форму, затем сохраняет новую микропоставку, включая микро post_id исходного сообщения в столбце reply_to, который я создал в моей таблице микросообщений. Любые подталкивания в правильном направлении очень ценятся. Не хочу лаять абсолютно неправильное дерево. Благодарю.

EDIT: В настоящее время я получаю ошибку маршрутизации при нажатии на ссылку ответа.

(No route matches [GET] "/shared/reply_form") 

Но насколько я вижу, все находится в нужном месте.

ответ

0

Хорошо, я только что прочитал ваш вопрос, и проблема связана с неправильной структурой.

  • у вас есть контроллер с действием, которое будет оказывать пост
  • ваше сообщение страница будет состоять в «пост» и многих ответов
  • каждый ответ, который я думаю, состоит из частично (скажем, a _reply.html.erb файл).

Структура страницы будет тогда следующее:

<div> 
... my post here... 
</div> 
<div id='repliesContainer'> 
<%- @replies..each do |id| -%> 
    <%= render :partial => "shared/reply", :locals => { :object => id} %> 
<%- end -%> 
</div> 

И мы называем это post.html.erb.

Это будет ваш shared/_reply.html.erb файл:

// note here that the id of the div contains the ID of the reply: each ID must be unique in the page.... 
    <div id='ReplyContainer-#{object}'> 
    ...reply content here... 
    </div> 

Теперь ваш файл post.js.erb содержит следующее:

$('#repliesContainer').append("<%= escape_javascript(render :partial => 'shared/reply', :locals => { :object => id}) -%>"); 

Содержание функции append() будет оказано на сервере в виде строки от частичного.

+0

Должно быть, я написал свой вопрос не так. Теперь я дал вам совершенно неправильную идею, и мне очень жаль, потому что вы написали отлично. Я не пытаюсь здесь давать ответы, которые я пытаюсь сделать формой, чтобы создать новый ответ под конкретным сообщением в фиде микросообщения стиля Twitter, который я создал. Я просто пытаюсь отобразить форму в частичном, щелкнув ссылку, а не ссылаясь на отдельную страницу для этой формы. – Ossie

0

У вас есть несколько проблем здесь:

  1. Как вы обнаружили, маршрут в форму ответа неверен. Пока вы не зафиксируете это, вы не сможете отладить остальную часть системы. Запустите rake routes | grep reply_form, чтобы найти URL-адрес для него (он скорее всего не будет включен/разделен), а затем посмотрите, какой ответ для этого URL-адреса. Держу пари, что он выдает ошибку (см. № 2).

  2. Ваш файл формы ответа имеет неправильное имя: _reply_form.js.erb является частичным, но это должно быть «reply_form.js.erb». Если вы нажмете правильный маршрут для этого контроллера, вы получите ошибку «Отсутствующий шаблон», потому что он ищет обычный шаблон, а не частичный.

  3. И, наконец, код reply_form.js.erb должен указывать на общий ответный_сигнал, так что если действительно находится в shared/_reply_form.html.erb, тогда ответ JS должен отображаться правильно.

Сказав, что ... Я действительно нелюбовь отправки Javascript обратно в браузер, отчасти потому, что он делает отладку JS намного сложнее - как вы собираетесь найти возвращаемый код в вашем браузере отладчик? Для такого типа дизайна могут быть некоторые варианты использования, но они, вероятно, очень редки.

Лучшее/более четкое решение - отправить данные JSON (например, рендеринга) обратно в браузер и обработать JSON и обновить DOM. Таким образом, весь ваш JS-код присутствует в браузере, и все, что вы получаете, это данные. Это будет намного легче отлаживать.

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