Rails中的关联模型和simple_form 4

时间:2014-09-06 15:30:03

标签: ruby-on-rails activerecord ruby-on-rails-4 simple-form

我的问题根本不应该复杂,但我无法弄清楚为什么它不起作用。我已经寻找了很多天的答案并尝试了很多东西,但问题仍然存在,所以如果我重复问题我会道歉。在我的应用程序中,我有3个模型User,Course&分类

class Category < ActiveRecord::Base
    has_many :courses, inverse_of: :category
end

class Course < ActiveRecord::Base
    belongs_to :user
    belongs_to :category, inverse_of: :courses
    accepts_nested_attributes_for :category
end

用户模型has_many:courses

这是课程和类别的架构:

create_table "categories", force: true do |t|
    t.string   "name"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  create_table "courses", force: true do |t|
    t.string   "title"
    t.text     "description"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.integer  "user_id"
    t.integer  "category_id"
    t.string   "address"
    t.boolean  "domicile"
    t.decimal  "lat"
    t.decimal  "lng"
    t.string   "city"
  end

  add_index "courses", ["category_id"], name: "index_courses_on_category_id"
  add_index "courses", ["user_id"], name: "index_courses_on_user_id"

在我的课程表单中,我可以看到类别列表,我可以选择一个,但是当我创建新课程时,没有为课程分配category_id。我使用simple_form,这是类别输入:

<%= f.association :category, value_method: :id, include_blank: false %>

在我的课程控制器中有这样的:

    def create
    @course = Course.new(course_params)
    @course.user = current_user

    respond_to do |format|
      if @course.save
        format.html { redirect_to @course, notice: 'Course was successfully created.' }
        format.json { render :show, status: :created, location: @course }
      else
        format.html { render :new }
        format.json { render json: @course.errors, status: :unprocessable_entity }
      end
    end
  end

而且:

def course_params
      params.require(:course).permit(:title, :description, :user_id, :city, :address, :lat, :lng, category_attributes: [:id, :name])
    end

1 个答案:

答案 0 :(得分:1)

我认为您的课程模型中不需要accepts_nested_attributes_for :category,因为它属于一个类别。

在您的控制器中,您的course_params不允许category_id参数,因此新课程未设置类别。您的course_params应为:

params.require(:course).permit(:title, :description, :user_id, :city, :address, :lat, :lng, :category_id)

在您的表单中,<%= f.association :category, value_method: :id, include_blank: false %>可以替换为(以显示类别名称):

<%= f.association :category, label_method: :name, value_method: :id, include_blank: false %>
相关问题