рельсы простые поля формы, не связанные с моделью
У меня есть существующая форма, которая привязана к модели с именем "заказ", но я хочу добавить новые поля формы, которые будут захватывать данные кредитной карты, такие как имя, номер cc и т. д., которые будут обрабатываться на стороннем платежном шлюзе.
но поскольку я не хочу сохранять информацию CC в нашей базе данных, в моей таблице заказов нет соответствующих столбцов. И это дает мне ошибку при отправке формы, что эти поля ввода кредитной карты не являются "частью" модели заказа.
5 ответов:
Вы можете использовать attr_accessor
class Order < ActiveRecord::Base attr_accessor :card_number endтеперь вы можете сделать
Order.first.card_number = '54421542122'или использовать его в своей форме или что-то еще вам нужно сделать.смотрите здесь для ruby docs http://www.ruby-doc.org/core-1.9.3/Module.html#method-i-attr_accessor а вот для полезного stackoverflow вопрос что такое attr_accessor в Ruby?
Не перепутайте его с attr_accessible! разница между attr_accessor и attr_accessible
Если я правильно понял ваш ответ, то что вы хотите сделать, объясняется на официальной странице wiki здесь:создать поддельный вход, который не читает атрибуты. Вы можете использовать поле, не связанное с каким-либо реальным столбцом базы данных по предложению Эдварда, однако вам не нужно определять атрибут в вашей модели, если поле формы не имеет ничего общего с моделью.
таким образом, трюк, описанный на странице, определяет пользовательский ввод под названием "FakeInput" и использует его как это:
<%= simple_form_for @user do |f| %> <%= f.input :agreement, as: :fake %> ....не забудьте перезагрузить сервер rails после добавления / изменения пользовательского ввода в качестве комментария монтажника.
обновление: обратите внимание:официальная страница Вики обновилась и пример кода на вики-странице не работает для тех, кто использует более старые версии SimpleForm. Используйте код ниже, если вы столкнулись с ошибкой, как
undefined method merge_wrapper_options for.... Я использую 3.0.1 и этот код работает хорошо.class FakeInput < SimpleForm::Inputs::StringInput # This method only create a basic input without reading any value from object def input template.text_field_tag(attribute_name, input_options.delete(:value), input_html_options) end end
лучший способ справиться с этим-использовать
simple_fields_forвот так:<%= simple_form_for @user do |f| %> <%= f.input :first_name %> <%= f.input :last_name %> <%= f.input :email %> <%= simple_fields_for :other do |o| %> <%= o.input :change_password, as: :boolean, label: 'I want to change my password' %> <% end %> <% end %>в этом примере я добавил новое поле под названием
change_password, который не является частью базовыхuser- модели.причина, по которой это хороший подход, заключается в том, что он позволяет использовать любые простые формы ввода / обертки в качестве полей. Мне не нужен ответ от @baxang, потому что он не позволяет использовать различные типы входов. Это кажется более гибким.
обратите внимание, хотя для это для работы, я должен был пройти
:otherдоsimple_fields_for. Вы можете передать любую строку/символ пока нет модели с таким же названием.т. е. к сожалению, я не могу пройти
:user, поскольку simple_form попытается создать экземпляр пользовательской модели, и мы снова получим то же сообщение об ошибке...
также, если вы просто пытаетесь что-то добавить и получить его в
params, но оставив его из хэша модели, вы можете просто сделать FormTagHelpers. http://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.htmlпример:
<%= simple_form_for resource, :as => resource_name, :url => invitation_path(resource_name), :html => {:method => :post} do |f| %> <%= devise_error_messages! %> <% resource.class.invite_key_fields.each do |field| -%> <%= f.input field %> <%= hidden_field_tag :object_name, @object.class.name %> <%= hidden_field_tag :object_id, @object.id %> <% end -%>
Я нашел очень простой (и несколько странный) изменение.
просто добавить С
valueключ внутри. Например:= simple_form_for @user do |f| = f.input :whatever, input_html: {value: ''}протестированы версии simple_from: 3.2.1, 3.5.1
Comments