使用简单形式 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
中丢失。
我正在创建一个允许人们 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
中丢失。