Как сделать немодельную форму в рубине на рельсах?
Я пытаюсь сделать немодельную форму в ruby на рельсах, большинство примеров, которые я могу найти, имеют только одно поле (скажем, поле поиска) или используют старый способ записи формы, подобной этой Форма электронной почты с Ruby on Rails
Если кто-нибудь может показать мне пример кода немодельной формы с указанием двух полей для представления и как я получу доступ к этим полям в контроллере, я был бы благодарен.
Большое спасибо.
Ответы
Ответ 1
Вам понадобятся методы FormHelper:
Скажите, что вам нужно простое test
действие, которое отправляется в действие do_test
:
Простой вид тестового действия (posts/test.html.erb):
<% form_tag '/posts/do_test' do %>
<%=label_tag 'name' %>
<%=text_field_tag 'name'%>
<%=label_tag 'phone' %>
<%=text_field_tag 'phone'%>
<div><%= submit_tag 'Save' %></div>
<% end -%>
В контроллере сообщений:
def test
end
def do_test
name = params[:name]
phone = params[:phone]
# do whatever you want...
end
Также вам нужно добавить эти 2 действия к маршрутам в config/routes.rb
map.resources :posts, :collection=>{:test => :get, :do_test => :post}
Ответ 2
Если вы создаете класс для представления своего объекта (пусть его называют ContactInfo
), вы можете определить методы этого класса, а затем использовать их с помощью стандартных помощников построителя форм Rails.
class ContactInfo
attr_accessor :name, :company, :email, :phone, :comments
def initialize(hsh = {})
hsh.each do |key, value|
self.send(:"#{key}=", value)
end
end
end
И в вашей форме:
<h2>Contact Us</h2>
<% form_for(@contact_info, :url => path_for_your_controller_that_handles_this, :html => {:method => :post}) do |f| %>
<%= f.label :name %>
<%= f.text_field :name %>
...
<% end %>
До сих пор, кто заботится правильно?
Однако добавьте validatable gem, и у вас есть настоящая причина сделать это! Теперь вы можете получать сообщения проверки как реальную модель.
Завершите мой класс ContactInfo:
class ContactInfo
include Validatable
attr_accessor :name, :company, :email, :phone, :comments
validates_presence_of :name
validates_presence_of :email
validates_presence_of :phone
def initialize(hsh = {})
hsh.each do |key, value|
self.send(:"#{key}=", value)
end
end
end
Мне это нравится, потому что вы можете написать свой контроллер так же, как и объект ActiveRecord, и не нужно обсуждать его с большой логикой, когда вам нужно повторно отобразить форму.
Кроме того, если вы используете Formtastic или другой настраиваемый конструктор форм, вы можете использовать этот объект вместе с ним, легко сохраняя существующие стили формы.
Ответ 3
Из Rails 4 вы можете использовать ActiveModel:: Model
http://blog.isnorcreative.com/2014/05/08/easier-non-activerecord-models-in-rails-4.html
class Contact
include ActiveModel::Model
attr_accessor :email, :message
validates :email, presence: true, length: {in:2..255}
end
Ответ 4
Вы можете использовать ActionView:: Helpers:: FormTagHelper для немодельного использования. Как
form_tag
text_field_tag
hidden_field_tag
В Api есть много хороших примеров. http://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html
Ответ 5
Вы думали об использовании презентатора?
http://blog.jayfields.com/2007/03/rails-presenter-pattern.html