Mam app Rails, w którym mam formularz, który wygląda mniej więcej tak:szyn: Zagnieżdżone zdalny formularz nie działa na stronie obciążenia
[ Parent list item 1 ]
[ Parent list item 2 ]
[ Parent list item 3 - expanded ]
[ Child list item 1 ]
Child inline input Child submit button
------------------
[Parent input]
Parent submit button
Wejście jednostka dominująca zawsze działa. Jest to forma zdalna, korzystająca z remote: true
. Kiedy dodaję obiekt nadrzędny, zostanie on automatycznie dodany do listy z innymi obiektami nadrzędnymi. Każdy rodzic może mieć wiele dzieci, są one wyświetlane i wyświetlane, kiedy użytkownik rozwija odpowiedni element listy nadrzędnej (jak w powyższym przykładzie). Użytkownicy mogą dodać więcej dzieci, wprowadzając wartość w polu Child inline input
. Ten formularz również używa remote: true
.
Problem polega na tym, że element dodawania dzieci nie zawsze działa przy ładowaniu pierwszej strony. Działa to jednak, jeśli odświeżam stronę. Ciężko mi zrozumieć, dlaczego tak jest.
Kiedy tworzę rodzic sprzeciw następujące js.erb
jest renderowany:
# screen_table_id is the list with parent objects.
# localized_strings/localized_string is the tr with the object
$("#screen_table_<%= @localized_string.screen.id %>").append("<%= j render partial: 'localized_strings/localized_string', locals: { screen: @localized_string.screen, localized_string: @localized_string } %>");
# I use the best in place gem to manage inline editing
jQuery('.best_in_place').best_in_place()
Odpowiednie części localized_strings/localized_string
wygląda następująco:
%tbody{ id: "localized_string_parent_#{localized_string.id}"}
%tr
%td.expandable-column
Clicking this reveals the child objects
/The list of children is initially hidden
%tbody.hidden[localized_string]
- if localized_string.translations.any?
/Renders the children
%tr
/This form doesn't work on page load, after I have added the parent
= render "translations/inline_form", app: localized_string.screen.app, screen: localized_string.screen, localized_string: localized_string, translation: localized_string.translations.build
And translations/inline_form
wygląda następująco:
= form_for [app, screen, localized_string, translation], remote: true do |f|
%td{ colspan: 2 }
.inline-form-group
= f.text_field :value, class: "form-control inline-form-control", placeholder: "Translation value", id: "localized_string_input_# {localized_string.id}"
%td
/Sometimes nothing happens when I click Submit.
= f.submit 'Add translation', class: "btn ban-success-outline"
Wadliwy przepływ wygląda to:
- obciążenie strony i utworzyć obiektu nadrzędnego (
LocalizedString
) - zostanie dodana do listy poprawnie.
- Rozwijanie nowego elementu listy nadrzędnej działa zgodnie z oczekiwaniami.
- Po kliknięciu przycisku przesyłania dla dziecka (
Translation
) manothing
.
Mam nadzieję, że moje pytanie jest zrozumiałe. Prosimy o komentarz, jeśli masz jakieś uwagi lub potrzebujesz wyjaśnienia. Jestem pełen pomysłów.
Dziękujemy! Sprawdzę to! – Anders
Również dlatego, że już używasz JS, rozważ zastąpienie tej funkcji komponentem reagowania. Klejnot [react-rails] (https://github.com/reactjs/react-rails) jest znakomity i dobrze obsługiwany.Dodatkowo pozwala na kierowanie na określone elementy interfejsu użytkownika, takie jak ten, z komponentami wielokrotnego użytku, bez konieczności przechodzenia przez trasę pojedynczej strony JS app a la Angular. Sklep Flow/Backbone może być przesadny dla tej aplikacji, ale w przypadku prostych komponentów możesz po prostu użyć ajaxa jQuery do aktualizacji w swoim komponencie reagowania. – engineerDave