我在pages / contact.html.erb
中有一个表单<%= form_for @contact_form, url: pages_contact_path, :method => :post do |f| %>
,但我想将数据发送到其他模型,我已将其创建为ContactForm,并且它没有控制器。
所以在Pages控制器中我有这样的东西(为了这个问题所有的简化..
class PagesController < ApplicationController
def contact
@contact_form = ContactForm.new(contact_form_params)
@contact_form.save
end
private
def contact_form_params
params.require(:contact_form).permit(:name, :phone, :email, :subject, :message)
end
end
当我尝试加载页面(页面/联系人)时,我收到此错误:
param is missing or the value is empty: contact_form
如果我取出(contact_form_params)白色列表,页面呈现正常,但当然所有数据都以nil发送。我可以在服务器上看到,哈希确实有contact_form所以我不知道还有什么要做..
Parameters: {"utf8"=>"✓", "authenticity_token"=>"qjfdt/4PgAjImpbB8Q3wJIJZnvQddIB1DmD0NdER6aM2265323AiahJr4fDh8XO6nyUISMsEEExn0f3EFcsbbA==", "contact_form"=>{"name"=>"Pedrinho", "phone"=>"", "email"=>"", "subject"=>"", "message"=>""}, "commit"=>"Update Contact form"}
请帮忙!
答案 0 :(得分:1)
啊,看起来与您的form for another model主题相关联。好吧,说得更广泛,问题在于你试图混淆两件事:对象的创建及其构建。 Rails guide告诉我们将这些内容映射到不同的控制器操作,例如pages/build_contact
和pages/create_contact
。第一个将包含一个普通的
def build_contact
@contact_form = ContactForm.new
end
而后者会根据传递的params构建联系表单并尝试保存它:
def create_contact
@contact_form = ContactForm.new(contact_form_params)
if @contact_form.save
# redirect somewhere
else
# render build_contact view with @contact_form and show errors there
end
end
请注意,这需要您相应地更改视图文件和路径。
好吧,我们假设你有充分的理由不采用两种不同的方法。
免责声明:我永远不会建议您这样做,但有条件逻辑可能。您应该检查是否获得了contact_form
参数,如果它们在那里,请尝试保存对象。相反的情况导致我们建立一个新的。请注意,这成为两个方法选项的丑陋变体,如上所述。
def contact
if got_contact_form?
@contact_form = ContactForm.new(contact_form_params)
@contact_form.save
# hint: what you gonna do if your save call failed due to validation errors?
else
@contact_form = ContactForm.new
end
end
private
def got_contact_form?
# check if you've got required params
params["contact_form"].present?
end