Vraag Rails 3 / Formulier zonder model: Hoe maak ik een formulier dat niet aan een model is gekoppeld?


Ik heb een model en ik heb een weergave die een formulier weergeeft voor het maken van een nieuw object op basis van dat model. Laten we die vorm noemen, Form1.

Zodra de gebruiker zich aanmeldt Form1, het object is gemaakt. Ik wil dan op de volgende pagina een tweede formulier weergeven Form2, die de gebruiker vraagt ​​om verschillende opties af te vinken voordat het object in de database wordt opgeslagen.

Mijn probleem is waarschijnlijk uiterst eenvoudig. Ik weet niet hoe ik moet creëren Form2, gezien het feit dat het niet rechtstreeks aan het model is gebonden. Omdat ik een ben Rails newbie, ik heb alleen formulieren gemaakt als volgt:

form_for(@object) { |f| ... }

@object is een object dat vanuit het model is geïnstantieerd

Probleem: Ik geloof niet dat dit soort code voor mijn doeleinden hier zal werken. Hoe maak ik Form2, gezien het feit dat het niet gebaseerd moet zijn op @object of @objecthet model?

Enkele details van mijn app:

De site accepteert waarden (Form1) voordat u doorgeleid naar een OAuth server.

Wanneer de gebruiker haar inloggegevens op de website verifieert OAuth server, wordt ze doorgestuurd naar mijn site. Een XML-RPC aanvraag haalt dan informatie op over het gebruikersaccount op de OAuth server.

De XML antwoord kan erop duiden dat de gebruiker slechts één account heeft op de OAuth server. Als dat het geval is, worden sommige waarden opgehaald uit de XML en toegevoegd aan het object - dat vervolgens (eindelijk) wordt opgeslagen in de database - en de gebruiker wordt omgeleid naar een succespagina.

Echter, als het XML antwoord geeft aan dat de gebruiker meerdere accounts heeft op de OAuth server, ik wil een formulier weergeven (Form2) waarmee de gebruiker kan selecteren welke accounts op de OAuth-server moeten worden gekoppeld aan mijn site. Zo Form2 vraagt ​​de gebruiker echt hoeveel te creëren objecten in plaats van specifieke kenmerken van een object.


64
2018-01-26 14:40


oorsprong


antwoorden:


Gebruik form_tag in plaats van form_for, gebruik dan de juiste formulier-helpers: text_field_tag in plaats van f.text_field, text_area_tag in plaats van f.text_area, etc. Voorbeeld:

<%= form_tag "/my_controller/update2" do %>
  <%= text_field_tag "account", "default info" %>
  <%= submit_tag "Save" %>
<% end %>

De Rails API-site heeft een geweldige verwijzing naar alle _tag-helpers: http://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html


115
2018-01-26 14:57



Beginnend in rails3 zijn validaties ontkoppeld van ActiveRecord, zodat u vanille-objecten kunt maken die als validators kunnen worden gebruikt met de formulierhelpers:

 class Person
   include ActiveModel::Validations

   attr_accessor :first_name, :last_name

   validates_each :first_name, :last_name do |record, attr, value|
     record.errors.add attr, 'starts with z.' if value.to_s[0] == ?z
   end
 end

en dan in je sjabloon:

<%= form_for(Person.new) do |f| %>
...

Het is een handige manier om de voordelen van formulierhelpers te gebruiken voor zaken als e-mailformulieren zonder een modelobject te hoeven maken dat aan uw schema is gekoppeld.


35
2017-10-10 13:49



Als u SimpleForm wilt gebruiken, is hier een specifiek antwoord voor Werkt form_tag met Simple_form?


4
2018-04-13 18:40



Om een ​​tafelloos model te maken,

class Person
  include ActiveModel::Model

  attr_accessor :first_name, :last_name

  validates :first_name, :last_name, presence: true
end

Dan volgens jou,

<%= form_for(Person.new) do |f| %>
 .... your form ....
<% end %>

Een andere vergelijkbare oplossing is te vinden op RailsCasts: Active-model


4
2017-10-15 08:09