使用简单形式 gem f.association 为新操作提供 NoMethodError

Using Simple form gem f.association gives NoMethodError for new action

我正在创建一个允许人们 post 投放广告的网站。在制作新广告时,我希望他们从我 seeds.rb 中的预填充列表中 select 该广告的类别。所以我做了以下模型和关联。

app/models/ad.rb

class Ad < ApplicationRecord
  # validations
  belongs_to :category
end

app/models/category.rb

class Category < ApplicationRecord
  has_ancestry
  extend FriendlyId
  friendly_id :name, use: :slugged

  has_many :ads
end 

然后我修改了我的广告表单,使用简单的表单,使用 f.association :category 从预先填充的类别列表中生成 selection(见下文)

app/views/ads/new.html.erb

<%= simple_form_for @ad, url: ads_path do |f| %>
  <%= f.input :title, label: false, placeholder: "Item/Service for Sale" %>
  <%= f.association :category, label_method: :name, value_method: :id %>
  # other stuff 
<% end %>

我继续收到以下错误:“Ads#new 中的 NoMethodError:# 的未定义方法 `category_id' 你的意思?类别 类别="

知道问题出在哪里吗?此外,这是我的广告控制器中的新操作和创建操作:

class AdsController < ApplicationController
  before_action :authenticate_user!, only: [:new, :create] 

  def new
    @ad = Ad.new
  end 

  def create
    @ad = current_user.ads.create(ad_params)
    if @ad.valid?
      flash[:notice] = "Ad created successfully"
      redirect_to ad_path(@ad)
    else
      render :new, status: :unprocessable_entity
    end 
  end 

  # other actions 


  private

  def ad_params
    params.require(:ad).permit(:title, :cost, :description, :quantity, :phone, :email, :accepted)
  end 
end 

如能提供帮助使此表格正常工作,我们将不胜感激!

也许您在广告 table

中遗漏了 category_id

虽然是广告 belongs_to :category,但如果您没有在广告上设置 category_id 列 table,它将不起作用。

如果您需要添加此列,您应该创建一个迁移

class AddCategoryToAds < ActiveRecord::Migration
  def change
    add_reference :ads, :category, index: true
  end
end

可以使用以下方法自动创建此迁移:

rails g migration AddCategoryToAds category:references

最后,允许category_id作为参数:

def ad_params
  params.require(:ad).permit(:title, :cost, :description, :quantity, :phone, :email, :accepted, :category_id)
end 

我唯一想到的是被遗忘的 category_id 列,从 ads 数据库中丢失 table - 特别是因为它也从允许的 ad_params 中丢失。