我正在创建一个允许人们发布广告的网站。在制作新广告时,我希望他们从我的seeds.rb中的预填充列表中为该广告选择一个类别。所以我做了以下模特和协会。
应用程序/模型/ ad.rb
class Ad < ApplicationRecord
# validations
belongs_to :category
end
应用程序/模型/ category.rb
class Category < ApplicationRecord
has_ancestry
extend FriendlyId
friendly_id :name, use: :slugged
has_many :ads
end
然后,我使用简单表单修改了我的广告表单,以使用f.association :category
从预先填充的类别列表中生成选择(见下文)
应用程序/视图/广告/ 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 %>
我继续收到以下错误:&#34;广告中的NoMethodError #new:undefined method`category_id&#39;为# 你的意思是?类别 类别=&#34;
知道问题是什么吗?此外,这是我的广告控制器中的新操作和创建操作:
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
获得此表格的一些帮助将不胜感激!
答案 0 :(得分:3)
也许您错过了广告表
中的category_id虽然广告属于:类别,但如果您未在广告表上设置category_id列,则无法使用。
如果您需要添加此列,则应创建迁移
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
答案 1 :(得分:1)
我唯一想到的就是忘记了category_id
列,ads
数据库表中缺少了这一列 - 特别是因为它也被允许ad_params
遗漏了。