Form builder i problem z helperem

Próbowałem zrobić porządek z formularzem i … prawie mi się udało :slight_smile: Tutaj oryginalny formularz: http://rubyonrails.pl/forum/t6565-Formularz-rejestracji.

W skrócie. Stworzyłem nowy form builder:

[code=ruby]class BootstrapFormBuilder < ActionView::Helpers::FormBuilder
delegate :content_tag, to: :@template

%w[text_field email_field password_field].each do |method_name|
define_method(method_name) do |name, *args|
options = args.extract_options!
options[:class] = options[:class] || ‘form-control’
args.push(options)

  form_css = ['form-group']
  form_css << 'has-error' unless object.errors[name].blank?


  if object.errors[name].blank?
    errors = ''
  else
    errors = content_tag :ul, class: "errors" do
      object.errors.full_messages_for(name).map do |err|
        content_tag(:li,err)
      end.join.html_safe
    end
  end

  content_tag :div, class: form_css do
    label(name) + super(name, *args) + errors
  end
end

end
end[/code]
Formularz teraz wygląda tak:

[code=ruby] <%= form_for(resource, :as => resource_name, :url => registration_path(resource_name), builder: BootstrapFormBuilder) do |f| %>

  <%= f.text_field :username, :autofocus => true %>
  <%= f.email_field :email %>
  <%= f.password_field :password %>
  <%= f.password_field :password_confirmation %>

  <%= f.submit "Sign up", class: "btn btn-default" %>
<% end %>[/code]

Wszystko ładnie działa. Ostatnia rzecz jaką chciałem zrobić to zamienić:

<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name), builder: BootstrapFormBuilder) do |f| %> na <%= bootstrap_form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %>
W application helperze dałem:

def bootstrap_form_for(record, options = {}, &block) options[:builder] = BootstrapFormBuilder form_for(record, options = {}, &block) end
Niestety nie działa, dostaję błąd: undefined method `users_path’ for #<#Class:0x0000000572cf90:0x00000005427930> w widoku w linijce wywołania ‘bootstrap_form_for’

Dodam, że to jest formularz rejestracji użytkownika (devise).

Macie jakieś pomysły co jest nie tak?

Już przy okazji

options[:builder] = BootstrapFormBuilder form_for(record, options = {}, &block)

form_for(record, options.merge(builder: BootstrapFormBuilder), &block)

Czy na pewno masz w routes dołączone Devise? Mógłbyś pokazać, co tam się znajduje?

Tak, mam w routes: devise_for :users
Najciekawsze, że nie działa nawet to:

def bootstrap_form_for(record, options = {}, &block) form_for(record, options = {}, &block) end
Tak jakby w helperze czegoś nie widział, co powoduje ten błąd.

A coś takiego:

form_for(record, options, &block)

@tiwi, zadziałało dzięki :), możesz jeszcze napisać co tu się złego działo ?

Nadpisywałeś zmienną options, zamiast po prostu przekazać ją dalej :wink: