代码之家  ›  专栏  ›  技术社区  ›  swilliams

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

  •  1
  • swilliams  · 技术社区  · 6 年前

    我正在创建一个允许人们发布广告的网站。在创建新广告时,我希望他们从我的种子中预先填充的列表中为该广告选择一个类别。rb。因此,我建立了以下模型和关联。

    应用程序/型号/广告rb

    class Ad < ApplicationRecord
      # validations
      belongs_to :category
    end
    

    应用程序/型号/类别。rb型

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

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

    应用程序/视图/广告/新建。html。雇员再培训局

    <%= 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中的NoMethodError#new:未定义的方法'category\u id'for”# 你是说?类别 类别=”

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

    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 回复  |  直到 6 年前
        1
  •  3
  •   Pablo    6 年前

    可能您缺少Ads表中的category\u id

    虽然广告属于:category,但如果您没有在Ads表上设置category\u id列,它将无法工作。

    如果需要添加此列,则应创建迁移

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

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

    rails g migration AddCategoryToAds category:references
    

    最后,允许category\u id作为参数:

    def ad_params
      params.require(:ad).permit(:title, :cost, :description, :quantity, :phone, :email, :accepted, :category_id)
    end 
    
        2
  •  1
  •   Bartosz Pietraszko    6 年前

    我唯一想到的就是忘记 category_id 列,中缺少 ads 数据库表-尤其是因为它在允许的 ad_params .