40
votes

I have a form that is using form_tag and not sure how to use it with the simple_form gem. This is how my form looks:

<%= form_tag create_multiple_prices_path, :method => :post do %>

  <% @prices.each_with_index do |price, index| %>
    <%= fields_for "prices[#{index}]", price do |up| %>
      <%= render "fields", :f => up %>
    <% end %>
  <% end %>

  <%= submit_tag "Done" %>
<% end %>

Can it be done? How would a form_tag change to use simple_form correctly? What about when using it with fields_for? A Newbie could use some help.

Thank you.

4

4 Answers

138
votes

You can use simple_form even if you aren't creating a form that's tied to a model.

Take this signin form as an example:

<%= simple_form_for :signin, { url: signin_path } do |f| %>
  <%= f.input :email %>
  <%= f.input :password %>
  <%= f.button :submit, "Sign In" %>
<% end %>

That will generate params like the following:

{
  ...
  "signin" => {
    "email"=>"[email protected]",
    "password"=>"[FILTERED]"},
    "commit"=>"Sign In"
   }
 }

In your controller you can reference the form fields using:

params[:signin][:email] ...
17
votes

simple_form is a wrapper around form_for, not form_tag. You can use simple_form_for instead of form_for, but form_tag just creates <form> tags with specified content, it is not relevant to simple form.

7
votes

You can avoid use of

params[:signin][:email]

using

<%= f.input :email, input_html: { name: "email" } %>

so

params[:email]
1
votes

like @barelyknown said You can use simple_form even without model You can also use field_for or simple_field_for

<%= simple_form_for :transaction_limits, {url: create_multiple_prices_path, method: :post} do |f| %>
  <% @prices.each_with_index do |price, index| %>
    <%= f.fields_for "prices[#{index}]", price do |up| %>
      <%= render "fields", :f => up %>
    <% end %>
  <% end %>

  <%= f.submit "button" %>
<% end %>