我有一个form_for
并不是要初始化一个对象,而只是传递表格数据来处理网络支付。
我被建议form_for ActiveModel
作为执行此操作的方法。
它工作正常一段时间但突然间我收到以下错误:
undefined method `model_name' for Module:Class
在这一行上被调用:
<%= form_for ActiveModel do |f| %>
在我的application/pay.html.erb
文件中。
以下是完整档案:
<%= form_for ActiveModel do |f| %>
<%= f.label :first_name %>
<%= f.text_field :first_name, params[:first_name] %><br />
<%= f.label :last_name %>:
<%= f.text_field :last_name, params[:last_name] %><br />
<%= f.label :card_number %>:
<%=f.text_field :card_number, params[:card_number] %><br />
<%= f.label :expiration_date %>:
<%= f.text_field :expiration_date, params[:expiration_date] %><br />
<%= f.label :cvv2_cvc2 %>:
<%= f.text_field :cvv2_cvc2, params[:cvv2_cvc2] %><br />
<%= f.submit %>
<% end %>
答案 0 :(得分:1)
我认为你误解了。
ActiveModel是一个可以包含在模型类中的模块。
调用form_for
时,您应该引用包含ActiveModel
的类的实例,例如
form_for(@article) do |f|
Rails使用 model_name
来确定模型的名称,因此提交按钮将显示“更新文章”或“创建文章”。
答案 1 :(得分:1)
如果您只想将数据传递给控制器,那么您应该使用form_tag
帮助器。
form_for
自动将表单数据与&#34;表单用于&#34;的模型对象的属性相关联。例如
<%= form_for @payment do |f| %>
<%= f.label :credit_card_number %>
<%= f.text_field :credit_card_number %>
<%= f.submit %>
<% end %>
单击提交按钮时,会自动将字段:credit_card_number映射到@ payment.credit_card_number。实际上,提交按钮将表单数据POST到create操作,并将其保存到数据库中。但是,如果您不想保存此数据,并且只需暂时将其传递到其他地方,请使用表单标记。
表单标记将表单数据传递给params
哈希,如下所示:
<%= form_tag({controller: payment_processor, action: pay} ,method: HTTP_VERB) %>
<%= label_tag :credit_card_number %>
<%= text_field_tag :credit_card_number %>
<%= submit_tag %>
<% end %>
提交后,此表单将调用您在form_tag之后指示的控制器的操作,并将表单中的数据通过params
散列传递给控制器params[:credit_card_number]
。
总之,form_for
专门用于将表单数据保存为模型的实例(即将信息放入数据库中),而form_tag
可用于将任何数据传递给控制器通过params
哈希。
您可以在导轨指南中阅读有关所有这些here的更多信息。希望这有帮助!