przesyłanie zmienny przez link jako post

Chciałbym utworzyć link, w którym przekaże pewne parametry za pomocą post-a. Czy taka operacja jest możliwa? Jeżeli tak to jak można to zrobić, co ewentualnie proponujecie w zamian (np. formularz) ?

Odsyłam do dokumentacji:

To powinno zadziałać:

link_to "Some action", some_action_path(some_attr: 'value'), method: :post

rails ujs is the answer!
sprawdź sobie np.: https://github.com/rails/jquery-ujs/blob/master/src/rails.js#L156

link_to something_path, :"data-method" => :post

powinno w zupełności wystarczyć

Niestety wasze podpowiedzi dalej nie rozwiązują mojego problemu.

Przykład Sarniaka sypie błędem, a konstrukcja w stylu - method: :post, wydaje mi się dziwna i też nie znalazłem jej w dokomentacji…
Natomiast w drugim przypadku method-post jest dodany jako kolejny parametr, tym samym inne parametry rowniez sa widoczne w adresie, a tego chce uniknac.

Właśnie odpaliłem appkę i kod jest taki:

# routes post '/some-post-action' => 'posts#some_post_action', :as => :some_post_action

# view link_to "Some post action", some_post_action_path(some_attr: 'dupa.8'), method: :post

# logs Started POST "/some-post-action?some_attr=dupa.8" for 127.0.0.1 at 2013-01-25 20:03:34 +0100 Processing by PostsController#some_post_action as HTML Parameters: {"authenticity_token"=>"gC6GE7Lma/OUSLky8twmGzaMu5gvt/YssivY2dKSlCA=", "some_attr"=>"dupa.8"} Rendered text template (0.0ms) Completed 200 OK in 3ms (Views: 2.1ms | ActiveRecord: 0.0ms)
Albo zrobiłeś jakiś błąd, albo masz starą wersję railsów. Nie wiem, czy masz nas za jakieś wróżki, ale taki pro tip - jeśli chcesz, żeby ktoś Ci pomógł, to napisz co Ci nie działa ;).

EDIT: jednak bawiąc się we wróżkę, zobacz, czy ładuje Ci się jquery_ujs i czy w linku ustawia Ci się atrybut data-method=“post”. W standardowym setupie method: post jako opcja powinna wyrenderować właśnie taki atrybut.

EDIT2: Podesłałem linka wprost do miejsca w dokumentacji, gdzie jest to napisane:

:method => symbol of HTTP verb - This modifier will dynamically create an HTML form and immediately submit the form for processing using the HTTP verb specified (...)

Faktycznie działa - musiałem wczoraj popełnić jakiś błąd. Dziękuje.
Natomiast parametry cały czas widzę w pasku adresu, a tego chciałbym się pozbyć.

[quote=trojek]Faktycznie działa - musiałem wczoraj popełnić jakiś błąd. Dziękuje.
Natomiast parametry cały czas widzę w pasku adresu, a tego chciałbym się pozbyć.[/quote]
Nie pisałeś, że parametry muszą być ukryte :wink: Ogólnie tu Ci pozostaje forma chyba - link z natury ma widoczne parametry, nawet jak na niego najedziesz myszką w niektórych przeglądarkach, to pokazuje Ci ścieżka, więc chowanie parametrów tutaj nie ma dużego sensu.

Zrób sobie helper / partial, który będzie Ci tworzył forme z polami typu “hidden” i to jest jedyny sensowny sposób jaki mi przychodzi do głowy.

Formularz to dobre rozwiązanie, ale przy nim pojawiają się kolejne problemy :).

  1. Chcialbym, żeby button był obrazkiem
  2. Po przesłaniu formularza i zczytaniu danych z niego chciałbym wyczyścić zwrotkę POST
    W związku z tym zaczynam się zastanawiać czy nie lepiej po prostu skupić się na JS.

[quote=trojek]Formularz to dobre rozwiązanie, ale przy nim pojawiają się kolejne problemy :).

  1. Chcialbym, żeby button był obrazkiem
  2. Po przesłaniu formularza i zczytaniu danych z niego chciałbym wyczyścić zwrotkę POST
    W związku z tym zaczynam się zastanawiać czy nie lepiej po prostu skupić się na JS.[/quote]
    Z buttonem nie ma żadnego problemu, można to ostylować przez CSS.

??

Kieruję formularz na akcję x, w zwrotce (request) z serwera dostaje informacje, ze akcja została wykonana przy uzyciu metody post i ma jakies tam dane w sobie. W związku z tym jak odświerzę stronę to znów zostanie wywołana akcja x przy uzyciu post z danymi. Jezeli np. post dodaje komentarz na blogu to przy odswierzeniu dodam go dwa razy, takiej sytuacji chce uniknac w zwiazku z tym chcialbym odebrac dane, a nastepnie przed zaladowaniem strony wyczyscic je, tak aby nie bylo sladu, ze post zostal wyslany.
Mam nadzieje, ze wyrazilem sie precyzyjnie, jezeli by cos bylo nie jasne proszę o informację.

Wrzuć kod metod(y) z kontrolera którymi to obsługujesz

Na razie tego nie obsługuje. Tym się nie przejmuje to będzie prosta sprawa - odebranie parametrów i dodanie rekordu do bazy danych.
Skupiam się na widoku, tj. jak zrobić przyciski/linki będące obrazkami, które służą do przesłania parametrów metodą post (choć może być get byle by tylko adres pozostał nie naruszony po przeładowaniu strony).
Powoli dochodze do wniosku, że nałatwiej będzie to zrobić przy pomocy jquery, choć wolał bym tego uniknąć.

Rozwiązuję problem JS-em i mam pewną trudność z dodaniem rekordu do bazy
mianowicie w logu serwera dostaje takiego requesta

Processing by Photos#create as */* Parameters: {"photo"=>{"photo_id"=>"0123456789", "date"=>"2007-12-04 00:00:00"}} (0.1ms) begin transaction (0.1ms) rollback transaction Completed 500 Internal Server Error in 23ms
w create mam taki kod:

def create @photo = Photo.new(params[:photo]) if @photo.save redirect_to root_path, :notice => "Zdjeci zostalo dodane prawidlowo" else render "new" end end
Wiecie może z czego wynika błąd ?

Otwórz inspektor kodu w Chromie/firebuga w FF (na request ajaksowy) i sprawdź jaki wyjątek jest wyrzucany.

Ewentualnie możesz spojrzeć w logi serwera tam też będzie ten błąd (i stack trace).

Dzięki, będę szukał błędu.