表格为不同型号

时间:2016-06-22 22:32:13

标签: ruby-on-rails forms

我在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"}

请帮忙!

1 个答案:

答案 0 :(得分:1)

啊,看起来与您的form for another model主题相关联。好吧,说得更广泛,问题在于你试图混淆两件事:对象的创建及其构建Rails guide告诉我们将这些内容映射到不同的控制器操作,例如pages/build_contactpages/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