Coffee script z pozycji przycisku formularza

Hej,
W jaki sposób można wywołać metodę coffee script z pozycji przycisku np. submit_tag albo innego?

Nie działa:

<%= submit_tag “Anuluj”, type: ‘button’, remote: true, class: ‘btn btn-default navbar-btn press_to_add’, :onclick => ‘clearForm’ %>

->
clearForm = ->
alert “See you next time!”
return

return

oraz nie działa

$ ->
$(".btn btn-default navbar-btn press_to_add").on “click”, ->
alert “See you next time!”

return

Co robić?
Pozdrawiam

  1. W erb lepiej użyj czystego js, czyli zamiast clearForm spróbuj clearForm()
  2. w drugim chyba kilku kropek w $ zapomniałeś

W pierwszym przypadku to ci nie zadziała, bo metody w coffescript są w czymś w rodzaju sandboxa, i jak chcesz żeby były widoczne z zewnętrz to nazwę metody musisz poprzedzić “window.”

W drugim przypadku @kham ma racje brakuje kropek, ale wszystko zależy w którym momencei wywołujesz ja a w którym masz wygenerowanego html, jesli js wczytasz po wczytaniu widoku (tzn wersja statyczna) to po uzupełnieniu kropek to rozwiązanie powinno tobie zadziałać, natomiast jak zmieniasz dynamicznie widok to zastosuj konstrukcję $(document).on …

Dziękuję wam za odpowiedź.
Mam dodatkowe pytanie:
załóżmy, że zrezygnowałbym z tworzenia formularzy w standardowy, railowski sposób, a chciałbym użyć javascriptu i/lub coffee scriptu. Jak z pozycji funkcji np. w coffee script wywołać funkcję z controlera w Rails (np. create), a jednoczesnie przekazując wymagane parametry np. z div’ów?

Pozdrawiam

Ja bym widoki normalnie generował, a w coffescript stworzyłbym tylko logike która byłaby odpowiedzialna za wysyłanie formularza. Ale widzę, że u ciebie problemem nie jest coffee script a javascript, gdyż nie wiesz jak to działa. CoffeeScript to nadbudówka na JavaScript.

Wiem, że nadbudówka. No może być javascript. Whatever. W każdym razie chciałbym właśnie wiedzieć jak tą logikę zbudować i “podpiąć”. Może być w javascript.

Mam przycisk w formularzu. Wywołuje on funkcję z javascript. Ale:
Jak przekazać parametry z formularza do funkcji javascript?
Jak z pozycji javascript wywołać metodę w controlerze railsowym np. create wraz z tymi parametrami?

A może źle myślę i jak należy taką logikę zbudować?
Pozdrawiam.

z tego co zrozumiałem, to po kliknieciu w przycisk w formularzu chcesz wykonać pewien kod JavaScript i pozniej przesłać dane z formularza “w tle”, jeśli chcesz wysłać formularz bez przeładowania strony, to w wpisujesz remote=true i to leci javascriptem, za obsługę tego odpowiada jquery_ujs. może napisz konkretnie jaki masz problem, bo teraz ciężko zgadnąć o co tobie dokładnie chodzi.

Nie musisz przekazywac parametrow do funkcji; funkcja znajac umiejscowienie formularza (np. jego ID) moze je odczytac przez np.

// wersja vanillaJS
var f = document.getElementById('form-id');
// a znajac 'name'
var f = document.forms['form-name'];

Mozesz rowniez przekazac sam formularz w prosty sposob - kazdy element formularza (czyli w szczegolnosci przycisk) posiada wlasciwosc form. Wiec mozesz zawsze napisac:

<button type="button" onclick="callme(this.form);">Submit</button>

(this wewnatrz onclick wskazuje na element ktory wygenerowal dane zdarzenie - czyli ‘biezacy’ przycisk)

Majac obiekt formularza, mozesz wartosci parametrow odczytac recznie - np:

// wersja vanilla js
var username = f.username.value; // zakladajac ze istnieje input name="username"
var password = f.password.value;// zakladajac ze istnieje input name="password"
// albo prosciej z jquery
var params = $(f).serializeArray();

Jesli formularz wskazuje na te metode w swoim action to po prostu mozesz ten formularz wyslac i wtedy nie trzeba robic nic :smile:

Ale jesli ma byc w tle badz jest to ‘inna’ akcja, to AJAX. Najprosciej uzywajac jQuery:

<button type="button" onclick="callme(this.form);">Submit</button>

function callme(f) {
    // bazowa akcja formularza dostepna w f.action ale mozemy chciec wywolac cos innego
    var url = .....
    $.post(url, $(f).serialize(), function(responseData) {
        alert('gotowe');
    });
}

Albo jak pisze @wafcio uzyc remote: true i wtedy Railsy zrobia to wszystko dla/za Ciebie

Dziękuję za odpowiedzi. Pomogły mi wielce :slight_smile: