Przekazanie z widoku do kontrolera

Witajcie,

Widok:

<%= form_for :test, url: some_path do |f| %>
<%= f.label :test >
<%= f.text_field :test >
<% end %>
<%= @test.inspect %>

Kontroler:

somehash = params[:test]
@test = somehash

W wyniku dostaje w przeglądarce to co wprowadzę do “input’a”, w tym przypadku:

{"test"=>"to co sobie wpisałem do inputa"}
  1. Pytanie pierwsze, dlaczego {“test”=>“to co sobie wpisałem do inputa”} a nie samo "to co sobie wpisałem do inputa"
  2. Pytanie drugie, jak mogę wyciągnąć z powyższego samo “to co sobie wpisałem do inputa” ?

Z góry dzięki za wyjaśnienie.

Zamień widok na

<%= form_for :test, url: some_path do |f| %>
  <%= f.label :banana >
  <%= f.text_field :banana > 
<% end %>
<%= @test.inspect %>

I zobacz co wtedy daje params[:test]. Powinieneś wtedy zrozumieć 1 i poradzić sobie z 2. Jak będziesz miał kłopoty, to pisz.

somehash = params[:test][:banana]

Wszystko jasne, pojawił się jednak nowy problem,
po odświeżeniu strony (input jest pusty), dostaje:

undefined method ‘[]’ for nil:NilClass

Kontroler:

somehash = params[:test][:banana]
@test = somehash

Nic dziwnego, params[:test] jest nilem, nie jest ustalone, a na tym nilu próbujesz odczytać wartość pod kluczem [:banana]

Ogólnie jest tak, że w wysyłaniu formularza masz hasha z, między innymi, kluczem z nazwą formularza, a w nim klucze z wartościami poszczególnych inputów.

{ test: { banana: wartość } }

czyli idąc dalej, jeśli chcesz odczytać wartość :banana, musisz najpierw sprawdzić, czy istnieje :test, na przykład:

somehash = params[:test].present? ? params[:test][:banana] : nil

nie wygląda to elegancko, lepiej zrobić tak:

somehash = params.fetch(:test, {})[:banana]

A może tak?

somehash = params[:test].try(:[], :banana)

Sposobów jest masa. Kłócenie się teraz który fajniejszy nie ma zbytnio sensu. Mnie np. w tym przypadku od wersji z fetch bardziej sie podoba wersja @michalg

chyba jedna kropka za dużo, ale masz rację to kwestia upodobań i przyzwyczajenia, a te ostatnie ciężko się zmienia u osób, które tego nie chcą.

Bardzo wam dziękuje za pomoc,

zastanawiam się, co z chwilą kiedy projekt posiada wiele formularzy, mnóstwo inputów, i z założenia wszystkie będą puste.

Musi być jakiś sposób żeby się to dało ładnie zorganizować ?
Chyba nie jest tak, że dla każdego inputa,trzeba będzie robić:

W jaki sposób używasz tych danych w kontrolerze?

@krzysiek1507, już pomijając to, co ja z tym robię, pewnie w większości przypadków takie dane ładowane są do kontenerów, tablic, procesowane według potrzeb.

Nie wiem czy do końca ogarniam to co próbujesz zrobić, ale w Railsach parametry filtrujesz sobie z użyciem Stronga Params a nastepnie takich odfiltrowanych parametrów używasz jako argumentu do metody jakiegoś obiektu w celu jego zaktualizowania czy do jakiejś klasy w celu stworzenia nowego obiektu. To co będziesz robił z tymi danymi już nie leży w kwestii kontrolera. On ma je tylko odebrać -> odfiltrować -> przekazać.

W moim konkretnym przypadku, staram się zrobić trylion inputów, wyciągam dane z webservice’ów (gem savon) i przekazuje do kontrolera ( w ramach testów), z założeniem - że dane nie są w żaden sposób filtrowane i user może wprowadzić co mu się podoba, lub pozostawić input pusty.