Rails 4 ForbiddenAttributesError

时间:2015-09-17 12:34:38

标签: ruby-on-rails rails-activerecord

我有以下表格:

= semantic_form_for @contact, :url => club_contact_path(id: @club.id), :html => {:novalidate => false, :id => 'contact_club_form'} do |f|
              .sm-12.xl-5
              = f.input :club_id, :as => :hidden, :input_html => { :value => @club.id }
              = f.input :firstname, :required => true
              = f.input :lastname, :required => true
              = f.input :email, :required => true
              = f.input :telephone, :as => :phone, :required => false
              = f.input :question, :required => true, :as => :text, :input_html => {:rows => 5, :cols => 40}
              = f.action :submit, :button_html => {:class => 'btn btn-aqua', :value => 'Submit'}

下面我已将contact_params方法添加到控制器。 这个错误并且告诉我我有一个Rails::ForbiddenAttributesError,但我似乎无法找出原因。

def contact_params
    params.require(:contact).permit(:firstname, :lastname, :email, :telephone, :question, :club_id)
  end

我的模型如下:

class Contact < ActiveRecord::Base
  belongs_to :club
  validates_presence_of :firstname, :lastname, :email, :question, :telephone, :club_id
end

编辑:添加了操作

def contact_club
    @contact = params[:contact]
    if Contact.create(@contact)
      byebug
      ContactMailer.send_contact_mail_to_club(@contact)
      render :nothing => true
    end
  end

2 个答案:

答案 0 :(得分:1)

您应该在创建操作中传递允许的参数而不是直接参数。因此,请尝试在创建调用中将@contact更改为contact_params

在您当前的代码中,您没有通过正确的参数。因此,请尝试更改下面的代码。

def contact_club
  @contact = params[:contact]
  if Contact.create(contact_params)
    byebug
    ContactMailer.send_contact_mail_to_club(@contact)
    render :nothing => true
  end
end

答案 1 :(得分:1)

contact_params方法将您的参数包装在Rails现在在创建或保存新对象时所期望的类中。现在你正在直接访问它,如果你使用的是强参数,你就不能再这样做了。您希望将contact_params传递给Contact.new或Contact.create方法。

此外,我对您的设置@contact = params [:contact]感到困惑,我认为您正在尝试获取Contact模型的实例,然后将其传递给邮件程序。那是对的吗?如果是这样,以下代码段应该更接近您正在寻找的内容。

def contact_club
  @contact = Contact.new(contact_params)
  if @contact.save
    byebug
    ContactMailer.send_contact_mail_to_club(@contact)
    render :nothing => true
  end
end