Как сделать немодальную форму в ruby ​​на рельсах? - PullRequest
18 голосов
/ 16 декабря 2009

Я пытаюсь создать немодальную форму в ruby ​​на рельсах, большинство примеров, которые я могу найти, имеют только одно поле (скажем, поле поиска) или используют старый способ написания формы, подобной этой Форма электронной почты с Ruby on Rails

Если бы кто-нибудь мог показать мне пример кода немодельной формы с, скажем, двумя полями для представления и как я получаю доступ к этим полям в контроллере, я был бы благодарен.

Большое спасибо.

Ответы [ 5 ]

32 голосов
/ 16 декабря 2009

Вам понадобится 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 / rout.rb

map.resources :posts, :collection=>{:test => :get, :do_test => :post}
6 голосов
/ 16 декабря 2009

Если вы создаете класс для представления вашего объекта (назовем его 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 %>

Пока, кого это волнует?

Однако, добавьте проверяемый драгоценный камень , и у вас есть реальная причина сделать это! Теперь у вас могут быть сообщения проверки, как в реальной модели.

Проверьте мой законченный класс 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 или другой пользовательский конструктор форм, вы можете использовать этот объект с ним, легко сохраняя существующие стили форм.

4 голосов
/ 17 сентября 2015

В 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
1 голос
/ 16 декабря 2009

Вы можете использовать ActionView :: Helpers :: FormTagHelper для использования не в моделях. Как

form_tag
text_field_tag
hidden_field_tag

Api имеет много хороших примеров. http://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html

0 голосов
/ 16 декабря 2009

Думали ли вы об использовании докладчика?

http://blog.jayfields.com/2007/03/rails-presenter-pattern.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...