我有一个看起来像这样的ContactsController:
class ContactsController < ApplicationController
def create
@contact = Contact.new(contact_params)
if captcha?
ContactMailer.potential_lead(@contact).deliver if @contact.save
else
@contact.errors.add(:base, 'Verify your humanity')
end
respond_with @contact
end
def thanks
@contact = 'success'
render file: '/layouts/contact'
end
private
def contact_params
params.require(:contact).permit(:name, :message, :interest, :email, :phone)
end
end
ContactsController,视图,邮件程序等都没有问题。一切正常。但是,我需要添加一个独立页面,并且我打算使用ContactsController来处理表单。因此,我在布局中创建了一个名为小部件的新视图。
的想法是,当某人在小部件页面上填写联系表格时,会有一个隐藏的字段可以处理您的兴趣,只使用联系人邮件程序,等等。
但是我遇到了一些问题。在我看来,我有:
=content_for :body do
.container
.row
.col
=render partial: '/shared/widget_form'
然后在我的部分内容中
:=tb_form_for @contact, remote: true, data: {errors: :inline, success: thanks_path } do |f|
.row
.col
= tb_form_errors(f.object, :base)
.row
.col
=f.text_field :name, class: 'form-control', placeholder: 'Name', required: true
然后我将路线更新为具有
resources :contacts, only: [:create]
match 'widget' -> 'contacts#create', via: :post
但是我最终还是
格式中的第一个参数不能包含nil或为空
尽管我想发布到“联系人”>“创建”,但我认为这可能是发布问题,但是我更改了该设置以获取并最终得到:
参数丢失或值为空:联系人
所以我认为我可能使用了不正确的匹配,所以我会这样做:
get 'widget', to: 'contacts#create', as: :widget
然后我将表单更新为:
=tb_form_for @contact, url: widget_path, remote: true, data: {errors: :inline, success: thanks_path}
我仍然得到
参数丢失或值为空:联系人
我想念什么?我只想在其他页面上重复使用该方法。
编辑: 如果我使用:
=tb_form_for Contact.new
它有效。...但这感觉像是在作弊。可以解决这个问题吗?
答案 0 :(得分:0)
rails如何呈现表单?
简而言之:
contacts#index
@contact = Contact.new
在您的情况下,有一种方法= content_for :body do
呈现partial: '/shared/widget_form'
我相信在其他视图或布局中的某个地方还有yield :body
。
因此,要使其正常工作,您需要在任何可能使用@contact
呈现视图/布局的控制器中初始化yield :body
变量