2010-11-19 2 views
30

Я понятия не имею, почему это не работает, я учусь рельсы и я следую за книгу он говорит, чтобы сделать это следующим образом:Rails form_for: дистанционное => правда не вызывается метод Js

<%= form_for([@article,@article.comments.new ], :remote=>true, :html => {:style=>'display: none;' }) do |f|%> 
    <div class="field"> 
     <%= f.label :name %> 
     <%= f.text_field :name %> 
    </div> 
    <div class="field"> 
     <%= f.label :email %> 
     <%= f.text_field :email %> 
    </div> 
    <div class="field"> 
     <%= f.label :body %> 
     <%= f.text_area :body %> 
    </div> 
    <%= f.submit %> 
<% end %> 

Однако это не сработает, и когда я проверяю запрос в firebug, url не заканчивается на .js, есть ли у вас какие-либо идеи?

+0

Вы можете добавить в соответствии с методами-контроллерами (например,index, create, new) и связанные с ним файлы просмотра, чтобы мы могли видеть всю картину? – Ingo

ответ

-11

Изменение:

[@article,@article.comments.new ] 

для

@article 

Я предлагаю вам чтения API на соответствующем разделе: http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html

+2

ryudice ищет новую форму комментариев для статьи ryudice. ryudice's form_for call - правильный синтаксис для того, что хочет ryudice. Ваше предложение было бы хорошо для стандартной формы статьи. Это сбивает с толку, потому что контекст никогда не упоминается. – natedavisolds

32

При проверке запрос, сделанный в поджигатель, просто потому, что URL не заканчивается на .js, это не значит, что он не вызывается из javascript. Чтобы убедиться, что вы должны проверить заголовок запроса, чтобы узнать, что такое параметр Accept. Если он говорит «application/javascript», тогда все хорошо.

Во-вторых, очень часто возникает проблема при запуске: remote => true, что необходимые библиотеки javascript не включены в ваш код. Таким образом, я думаю, что следующий код отсутствует макет:

<%= javascript_include_tag :defaults %> 
<%= csrf_meta_tag %> 

Если это так, просто включите его внутри тега <head> макета.

+0

Вы имеете в виду под заголовком «html header» главный тег шаблона, где форма/ссылка с пультом: true is? – Timo

+0

Да, спасибо, что указали это. Это было не так ясно. Но да, он должен быть включен внутрь в тег – DanneManne

21

Скорее всего, произойдет то, что вам не хватает файла rails.js, который обрабатывает это для вас, используете ли вы прототип или jquery.

Если вы используете jQuery, самый простой способ получить все необходимые файлы - использовать жемчужину jquery-rails. Это добавит генератор для установки jquery и необходимых rails.js.

типа что-то вроде внутри рельсов корня приложения:

rails g jquery:install 

И затем, внутри вашего application.html.erb добавьте строку

<%= javascript_include_tag :defaults %> 

или явно (не забудьте включить ваш JQuery отдельно):

<%= javascript_include_tag :rails, :application %> 

[EDIT: для Rails 3.1 или более с использованием актива трубопровод]

Используйте jquery-rails камень (как упоминалось выше) и добавьте следующие строки в app/assets/javascripts/application.js (если их нет уже):

//= require jquery 
//= require jquery_ujs 

Надеется, что это помогает!

+0

он работал хорошо .. Спасибо .. – Neo

+0

У нас была эта проблема, но мы включили 'jquery_ujs.js', чтобы исправить ее. –

+0

Да, правда, это немного изменилось с рельсами 3.1 и конвейером активов. Я обновил свой ответ, чтобы отразить это. – nathanvda

4

Проверьте контроллер: есть ли блок reply_to?

Если вы создали приложение с рельсами генерировать эшафот, он будет иметь что-то вроде

respond_to do |format| 
     format.html 
     format.xml { .... } 
    end 

Если она есть, просто взять весь блок из, от respond_to до конца; или же заменить весь блок с одной линией

respond_to :html, :js 

или же отредактировать блок, добавив дополнительную строку, показанную здесь

respond_to do |format| 
     format.html 
     format.js 
     format.xml { .... } 
    end 

Либо должны работать в вашем случае.

4

Проверьте /app/assets/javascript/application.js файл

Он должен быть включен ниже файлы там. jquery_ujs отвечает за работу remote=> true особенность.

require `jquery` 
require `jquery_ujs` 

Happy Coding !!

+1

У меня была аналогичная проблема с новичком, когда я писал «Agile Web Development with Rails», в главе 11.2 «Итерация F2: создание корзины на основе AJAX». Проблема решается с помощью uncomment '= require jquery' в указанном вами файле. Надеюсь, это поможет другим людям. –

+0

Это замечательно @cppinitiator! –

6

Эта ошибка возникает, если вы не добавили jquery_ujs. Вы просто включили файл jquery.

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

В зависимости от вашего сценария вы можете следовать 1-му или 2-му решению.

первый раствор:

<%= javascript_include_tag :jquery, :jquery_ujs %> 

второе решение:

  1. Требовать как JQuery и jquery_ujs в приложение/активы/application.js

    //= require jquery.js 
    
    //= require jquery_ujs 
    
  2. Включите файл application.js в свой макет.

    <%= javascript_include_tag :application %> 
    

Примечание:

добавить Также CS тег в файле макет для обоего решений.

<%= csrf_meta_tag %> 

Я предполагаю, что у вас есть код ниже в вашем Gemfile и уже установлен этот драгоценный камень.

gem 'jquery-rails' 
+0

Второе решение решило мою проблему! –

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