2009-11-25 1 views
6

Иногда нам нужна форма без создания модели - например, поле поиска или адрес электронной почты, куда следует отправить некоторые инструкции. Каков наилучший способ создания этих форм? Могу ли я создать виртуальную модель или что-то вроде этого? Я бы хотел использовать formtastic, но не form_tag.виртуальная модель и form_for (или formtastic)

ответ

18

Во-первых, Formtastic не нуждается в модели во всех случаях, хотя она, безусловно, работает лучше всего и требует меньше кода с моделью.

Как и собственный встроенный Rails form_for, вы можете передать символ вместо объекта в качестве первого аргумента, а Formtastic построит форму и опубликует параметры на основе символа. Например:

<% semantic_form_for(:session) do |f| %> 
    ... 
<% end %> 

Это сделает значения формы доступны для вашего контроллера как params[:session].

Во-вторых, модель не означает ActiveRecord модель. Я имею в виду, что Formtastic будет работать с любым экземпляром класса, который quacks похож на модель ActiveRecord.

Классический пример этого, что Многие люди используют Authlogic для аутентификации с помощью Formtastic. Часть Authlogic идея модели UserSession, которая работает отлично:

Контроллер:

def index 
    @user_session = UserSession.new 
end 

Форма:

<% semantic_form_for(@user_session) do |f| %> 
    <%= f.input :login %> 
    <%= f.input :password %> 
<% end %> 

Это сделает ваши данные формы доступны в вашем контроллере как params[:user_session].

Это действительно не так сложно создать экземпляр модели, чтобы обернуть проблемы вашей модели. Просто продолжайте применять методы, которые Formtastic ожидает, пока вы не заработаете!

+1

Я принимаю ваш вызов!Здесь вы найдете класс, не являющийся ActiveRecord, для «завершения проблем вашей модели». http://dondoh.tumblr.com/post/4142258573/formtastic-without-activerecord – dondo

-1

Или вы просто создаете форму с form_for и оставьте ссылку модели пустой. , например <% form_for "", :url=>some_url do |f| %> <%= f.text_field "some_attribute" %> <%= submit_tag "submit" %>

Вы можете получить значения, просто говоря Params [: some_attribute] в контроллере.

+0

Я был бы признателен за комментарий к предложению. – Sid

+1

Я бы сказал, это потому, что OP ищет семантическое решение, в идеале используя Formtastic, и вы предлагаете шаг назад. –

1

default_language.rb

 
class DefaultLanguage 
    attr_accessor :language_id 
end 

foo_controller.rb

 
    def index 
    @default_language = params[:default_language] || Language.find_by_name("English") 
    end 

index.erb

 
<% semantic_form_for @default_language do |form| %> 
    <% form.inputs :id => 'default_language' do %> 
     <%= form.input :id, 
     :as => :select, 
     :collection => @languages, 
     :required => false, 
     :label => "Primary Language:", 
     :include_blank => false %> 
    <% end %> 
    <% end %> 

Я использовал AJAX, чтобы отправить форму, когда значение изменилось.