Подтвердить что ты не робот

Rails 3 - link_to для вызова частичного использования jquery ajax

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

Я хотел бы нажать ссылку "Предварительный виджет" и отобразить _widget.html.erb в превью .

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

EDIT: обновляет ссылку в соответствии с предложениями Ignatius Reza

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 %>

routes.rb

match 'preview_widget' => 'widgets#preview_widget'
4b9b3361

Ответ 1

Хорошо, наконец, получилось, что это работает со следующими изменениями.
routes.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%, что было не так с предыдущим кодом - по крайней мере теперь он работает.

Ответ 2

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

его можно добавить, добавив: remote = > true в ссылку "Предварительный просмотр", например:

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

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

в качестве примечания, я не думаю, что установка атрибута: id в "Виджет просмотра" для @widget является разумным.. поскольку он поместит строковое представление виджета, которое обычно будет выглядеть как "< Widget: 0x12412.. > " возможно, было бы лучше изменить его на "widget-link - # {@widget.id}"

Ответ 3

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

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

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

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

Код WRONG, который запускает 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 rendered без файла макета. Который не является частичным, но близок к тому, что хотел Ян. Я ожидал, что 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