Rails表单中使用的不同部分,或如何重用方法

时间:2019-06-26 16:23:48

标签: ruby-on-rails

我有一个看起来像这样的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

它有效。...但这感觉像是在作弊。可以解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

rails如何呈现表单?

简而言之:

  1. 例如,用户将获取请求发送到contacts#index
  2. 在#index操作中,您类似@contact = Contact.new
  3. 如果未指定其他视图,默认情况下将为#index操作呈现index.haml视图。
  4. 在这种情况下,index.haml视图将能够访问@contact变量。

在您的情况下,有一种方法= content_for :body do呈现partial: '/shared/widget_form'

我相信在其他视图或布局中的某个地方还有yield :body

因此,要使其正常工作,您需要在任何可能使用@contact呈现视图/布局的控制器中初始化yield :body变量