Иногда нам нужна форма без создания модели - например, поле поиска или адрес электронной почты, куда следует отправить некоторые инструкции. Каков наилучший способ создания этих форм? Могу ли я создать виртуальную модель или что-то вроде этого? Я бы хотел использовать formtastic, но не form_tag.виртуальная модель и form_for (или formtastic)
ответ
Во-первых, 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 ожидает, пока вы не заработаете!
Или вы просто создаете форму с form_for и оставьте ссылку модели пустой. , например <% form_for "", :url=>some_url do |f| %>
<%= f.text_field "some_attribute" %>
<%= submit_tag "submit" %>
Вы можете получить значения, просто говоря Params [: some_attribute] в контроллере.
Я был бы признателен за комментарий к предложению. – Sid
Я бы сказал, это потому, что OP ищет семантическое решение, в идеале используя Formtastic, и вы предлагаете шаг назад. –
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, чтобы отправить форму, когда значение изменилось.
Я принимаю ваш вызов!Здесь вы найдете класс, не являющийся ActiveRecord, для «завершения проблем вашей модели». http://dondoh.tumblr.com/post/4142258573/formtastic-without-activerecord – dondo