使用Simple form gem f.association为新操作提供NoMethodError

时间:2018-02-03 15:15:25

标签: ruby-on-rails ruby ruby-on-rails-5 simple-form simple-form-for

我正在创建一个允许人们发布广告的网站。在制作新广告时,我希望他们从我的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 

获得此表格的一些帮助将不胜感激!

2 个答案:

答案 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遗漏了。