Вложенная ошибка insert_html: Ruby On Rails и Javascript - PullRequest
3 голосов
/ 24 апреля 2009

Привет всем! Эта проблема сводит меня с ума! Это похоже на ошибку рендеринга JS Rails, но я не уверен.

Краткий обзор:

Я пытаюсь создать RELEASE, в котором has_many TRACKs. Эти треки имеют много TRACK_LINKS. Эти TRACK_LINKs затем ассоциируются с TRACK_LINK_TYPE (mp3, m3u, подкаст и т. Д.). Думайте об этом как об альбоме. Таким образом, при добавлении релиза вы можете добавить дорожки альбома, и каждая дорожка альбома может иметь разные ссылки (mp3, m3u, подкаст и т. Д.). Я на очень ранней стадии и использую строительные леса - пользователь может создать релиз в форме, добавить треки через JS и добавить ссылки треков через JS. Это все работает нормально, но добавление треков не работает, когда в коде есть функция «Добавить трек»! Он молча терпит неудачу - без ошибок, просто идет на # якорь.

В основной форме выпуска я рендеринг частичного трека и добавление ссылки для добавления треков:

<div id="tracks">
    <%= render :partial => 'track', :collection => @release.tracks -%>
</div>

<%= add_track -%>

Теперь в части TRACK я рендерим часть TRACK_LINK и добавляю ссылку для добавления TRACK_LINK:

<div class="track">
    <fieldset>
    <legend>Track</legend>
    <p> 
        <% @track = track %>
    <%= error_messages_for :track -%>

        <% fields_for_track(track) do |track_form| -%>
        Track Name
    <br />
    <%= track_form.text_field :name -%>
    <%= link_to_function "remove", "$(this).up('.track').remove()" -%>
    <% track_links_id = "track_links_#{Time.now.to_i.to_s}" %>
    <div id="<%= track_links_id %>">
            <%= render :partial => 'track_link', :collection => @track.track_links -%>              
    </div>
    <%= add_track_link track_links_id -%>   
    <% end -%>
    </p>
</fieldset>
</div>

А в части TRACK_LINK я создаю поля TRACK_LINK (со связанным с ними полем TRACK_LINK_TYPE):

<div class="track_link">
    <% @track_link = track_link -%>
<% fields_for_track_link(track_link) do |track_link_form| -%>
    Track Link
    <br />
    <%= track_link_form.text_field :url -%>
    <%= select ("track_link_type", "id", @track_link_type.map {|type| [type.name, type.id]}) -%>        
        <%= link_to_function "remove", "$(this).up('.track_link').remove()" -%>     
<% end -%>
</div>

Наконец, вот вспомогательные методы link_to_function:

module ReleasesHelper
    def fields_for_track(track, &block)
        prefix = track.new_record? ? 'new' : 'existing'
        fields_for("release[#{prefix}_track_attributes][]", track, &block)
    end

    def fields_for_track_link(track_link, &block)
        prefix = track_link.new_record? ? 'new' : 'existing'
        fields_for("track[#{prefix}_track_link_attributes][]", track_link, &block)
    end

    def add_track
        track = Track.new
        track.track_links.build
        link_to_function 'Add Track' do |page| 
            page.insert_html :bottom, :tracks, :partial => 'track', :object => track
    end
end

    def add_track_link(name)
        link_to_function "Add Track Link" do |page|       
            page.insert_html :bottom, name, :partial => 'track_link', :object => TrackLink.new
    end
end
end

В результате каждая функция link_to_function работает нормально, но когда у меня есть функции «Добавить трек» и «Добавить трек-ссылку» одновременно, функция «Добавить трек» link_to_function не работает. Что-то в этом рендеринге функции «Добавить ссылку на трек» испортило! Извиняюсь за длинный пост! Надеюсь, это не раздражает, и кто-то может протянуть руку?

лучше, Praveen

1 Ответ

1 голос
/ 15 мая 2012

Взгляните на https://github.com/nathanvda/cocoon. Документы хороши, и это спасает вас от написания и поддержки этого кода. Если вам интересно узнать, как это работает, взгляните на источник (он не слишком сложный). Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...