Rails 3.1: Добавление и удаление полей с помощью динамического jQuery (Railscasts #197)

Rails noob здесь.
Я искал информацию в Google и StackOverflow, чтобы получить пример, используемый в Railscasts #197 работает, но ни одна из ссылок, которые я посетил, не работает с Rails 3.1!
Когда я нажимаю кнопку удаления или добавления новых полей, абсолютно ничего не происходит. Это так расстраивает :/

Кто-нибудь знает, почему приведенный ниже код не добавляет и не удаляет поля динамически, как в эпизоде ​​с RailsCasts?

application_helper.rb

def link_to_remove_fields(name, f)
f.hidden_field(:_destroy) + link_to_function(name, "remove_fields(this)")
end 

def link_to_add_fields(name, f, association)
new_object = f.object.class.reflect_on_association(association).klass.new
fields = f.fields_for(association, new_object, :child_index => "new_#{association}") do    |builder|
    render(association.to_s.singularize + "_fields", :f => builder)
 end 
    link_to_function(name, "add_fields(this, '#{association}', '#    {escape_javascript(fields)}')", :remote => true)
 end



app.js

// delete characters on users#edit and users#new
function remove_fields(link) {
$(link).prev("input[type=hidden]").val("1");
$(link).closest("#character").hide();
}

// add character fields on users#edit and users#new
function add_fields(link, association, content) {  
    var new_id = new Date().getTime();  
    var regexp = new RegExp("new_" + association, "g");  
    $(link).parent().before(content.replace(regexp, new_id));  
}



html

<div id="account">
<div class="field">
    <%= f.label :account_name %><br />
    <%= f.text_field :account_name %>
</div>
<div class="field">
    <%= f.radio_button(:realm, "USWest") %>
    <%= f.label(:realm, "USWest") %>

    <%= f.radio_button(:realm, "USEast") %>
    <%= f.label(:realm, "USEast") %>

    <%= f.radio_button(:realm, "Europe") %>
    <%= f.label(:realm, "Europe") %>

    <%= f.radio_button(:realm, "Asia") %>
    <%= f.label(:realm, "Asia") %>
</div>      
<div class="field">
    <%= link_to_add_fields "Add new account", f, :characters %>
</div>

<div class="field"> 
    <%= f.hidden_field :_destroy %>
     <%= link_to_remove_fields "remove", f %>
</div>
<%= f.fields_for :characters do |builder| %>
<%= render "characters/char_fields", :f => builder %>
<% end %>
</div>

person imjp    schedule 01.08.2011    source источник
comment
ты когда-нибудь это понял?   -  person turbo2oh    schedule 09.02.2013


Ответы (2)


Я не вижу необходимый частичный вызов:

render(association.to_s.singularize + "_fields", :f => builder)
person apneadiving    schedule 01.08.2011
comment
Я немного изменил код, когда вставлял его, чтобы предотвратить вставку лишнего кода, но частичные части отображаются в приложении нормально. Проблемы возникают с функциями в apphelper.rb и app.js :( - person imjp; 02.08.2011

Хорошо, сначала вам нужно убедиться, что вы используете правильный тег включения rails 3.1 для файла application.js в заголовке вашего файла application.html.erb. В скринкасте он использует старый способ:

<%= javascript_include_tag :defaults, :cache => true %>

Новый способ:

<%= javascript_include_tag "application" %>

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

// This is a manifest file that'll be compiled into including all the files listed below.
// Add new JavaScript/Coffee code in separate files in this directory and they'll automatically
// be included in the compiled file accessible from http://example.com/assets/application.js
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
// the compiled file.
//
//= require jquery
//= require jquery_ujs
//= require_tree .

Похоже, ваш код уже настроен для jquery, поэтому, если вы хотите упростить его, просто добавьте этот код в конец файла application.js под комментариями, и все должно быть настроено.

person ne.hannah    schedule 03.09.2011