Rails 3 - link_to для частичного вызова с использованием jquery ajax - PullRequest
11 голосов
/ 22 января 2011

Я пытаюсь получить link_to для отображения частичного с помощью jquery ajax, но не могу заставить его работать (правка: возвращает пустой экран), и я не уверен, что я 'м отсутствует.Буду признателен за любую помощь.

Я бы хотел щелкнуть ссылку «Предварительный просмотр виджета» и отобразить ее _widget.html.erb в div preview .

Насколько я понимаю, ссылка "Предварительный виджет" должна вызывать действие def preview_widget , которое вызывает preview_widget.js.erb , которое затем отображает частичный _widget.html.erb в разделе.

РЕДАКТИРОВАТЬ: обновляет ссылку в соответствии с предложениями Игнатия Резы

show.html.erb

<%= link_to "Preview Widget", :action => 'preview_widget' , :id => @widget.id, :remote => true %> %>
<div id="preview"></div>

widget_controller.rb

def preview_widget  
    respond_to do | format |  
        format.js {render :layout => false}  
    end
end

preview_widget.js.erb

$( "#preview" ).html( "<%= escape_javascript( render( :partial => "widget", :locals => { :widget => @widget} ) ) %>" );

_widget.html.erb

<% @widget.videos.each do |video| %>
      <h3><a href='#'><%= video.name %></a></h3>
      <div>
        <object height='316' width='540'>
          <embed  style='border: 1px solid #333333;' height='316' width='540' allowfullscreen='true' allowscriptaccess='always' type='application/x-shockwave-flash' src='<%= video.url %>'>
        </object>
      </div>
  <% end %>

rout.rb

match 'preview_widget' => 'widgets#preview_widget'

Ответы [ 3 ]

6 голосов
/ 24 января 2011

ОК, наконец-то, это работает со следующими изменениями.
rout.rb (добавлен элемент в ресурсы виджетов)

  resources :widgets do
    member do
      get 'preview_widget'
    end
  end

show.html.erb (изменено link_to для соответствия маршрутам)

<%= link_to 'Preview', preview_widget_widget_path(:id => @widget.id),  :remote => true %>

Теперь отображается частичное.Я все еще не уверен на 100%, что не так с предыдущим кодом - по крайней мере, теперь он работает.

5 голосов
/ 22 января 2011

По вашему вопросу не ясно, что вы "не можете заставить его работать" ... но из того, что я вижу в коде, который вы дали ... все кажется правильным, но вы пропускаете реальный вызов ajax ...

это можно добавить, добавив: remote => true к ссылке «Просмотр виджета», например:

<%= link_to "Preview Widget", :action => 'preview_widget' , :id => @widget, :remote => true %>

если поведения по умолчанию достаточно .. или вы можете добавить свой собственный вызов ajax в application.js ..

как примечание, я не думаю, что было бы разумно устанавливать атрибут: id ссылки «Предварительный просмотр виджета» на @widget, так как это поместит строковое представление виджета, которое обычно будет выглядеть как « "возможно, было бы лучше изменить его на" widget-link - # {@ widget.id} "

4 голосов
/ 20 сентября 2012

У меня похожая проблема, которая привела меня к этой угрозе, поэтому я подумал, что поделиться своим решением здесь может быть полезно любому.

С :remote => true вместо этого я получил обычный HTTP-запрос на http://localhost:3000/info/about?remote=trueразыскиваемого AJAX-запроса на http://localhost:3000/info/about

Исправление было легко, но сложно найти!

В моем представлении HAML:

НЕПРАВИЛЬНЫЙ код, которыйвызывает HTTP-запрос

= link_to( image_tag("icons/information.png", :title => t('menu.info')), :controller => "info", :action => "about", :remote => true )

OK-код, который запускает AJAX-запрос

= link_to( image_tag("icons/information.png", :title => t('menu.info')), {:controller => "info", :action => "about"}, :remote => true )

Единственное отличие состоит в {фигурных скобках}!

Забавнохотя с AJAX-запросом я получаю info/about.html без файла макета.Что не является частичным, но близко к тому, что хотел Ян.Я ожидал, что info/about.js.erb будет обработано.

В InfoController

  def about
    respond_to do |format|
      format.html # renders ‘views/info/about.html.erb’ inside layout template on HTTP Request
      format.js# renders ‘views/info/about.html.erb’, without layout
    end
  end

-

  def about
    respond_to do |format|
      format.html # => ‘views/info/about.html.erb’ inside layout template on HTTP Request
      format.js {render 'about.js'} # => renders ‘views/info/about.js.erb’
    end
  end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...