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

Rails form_for: remote => true не вызывает метод 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, есть ли у вас какие-то идеи?

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

введите что-то вроде внутреннего корня приложения rails:

rails g jquery:install

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

<%= javascript_include_tag :defaults %>

или явно (не забудьте указать свой jquery отдельно):

<%= javascript_include_tag :rails, :application %>

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

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

//= require jquery
//= require jquery_ujs

Надеюсь, это поможет!

Ответ 3

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

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

require `jquery`
require `jquery_ujs`

Счастливое кодирование!!

Ответ 4

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

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

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

1-е решение:

<%= javascript_include_tag :jquery, :jquery_ujs %>

2-е решение:

  • Требовать как jquery, так и jquery_ujs в приложении /assets/application.js

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

    <%= javascript_include_tag :application %>
    

Примечание:

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

<%= csrf_meta_tag %>

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

gem 'jquery-rails'

Ответ 5

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

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

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

Если у него есть это, просто возьмите весь блок, от reply_to до конца; или альтернативно заменить весь блок на одну строку

    respond_to :html, :js

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

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

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

Ответ 6

Если у вас есть file_field, то он отправляется как html, даже когда remote: true - у меня ушло много времени на то, чтобы разобраться с этим, поэтому я добавляю этот ответ, чтобы, возможно, сэкономить кому-то еще время, есть решение, используйте гем remotipart, см. ответ здесь