Поэтому я создаю две модели, одну «Курс» и одну «Раздел» с каркасом, и мне нужен раздел, чтобы отображать курсы в раскрывающемся меню, которое отражает любые курсы, которые были созданы в модели курса, и использую его для создания в разделе. Мне удалось получить раскрывающееся меню, в котором отображаются курсы, созданные из «Курса», но когда я создаю новый раздел, курс отображается как пустой. У курса есть название, отдел, номер и кредитные часы. В разделе указаны семестр, номер, курс и номер комнаты.

То, что я изменил, чтобы выпадающее меню было (в _form.html.erb представлений раздела)

  <div class="field">
  <%= form.label "Courses", class: 'courses'%>
  <%= form.collection_select(:section, Course.all, :id, :name) %>
  </div>

Выдает ошибку "Курсы должны существовать".

Раньше у меня было:

  <div class="field">
  <%= form.label "Courses", class: 'courses'%>
  <%= form.collection_select(:course_ids, Course.all, :id, :name) %>

Это не выдало ошибки и позволило мне создать раздел, просто не добавляя выбранный курс в базу данных раздела.

https://api.rubyonrails.org/classes/ActionView/Helpers/FormOptionsHelper.html#method-i-collection_select

Из чтения следует, что имя должно быть определено в разделе моделей конечно, но когда я пытаюсь это выдает ошибку. Я также понимаю, что у меня нет настройки для записи курса с определенным идентификатором раздела, поэтому он не сохраняет его при создании нового раздела. Мой вопрос: что мне добавить или изменить, чтобы это работало? Неправильно ли использовать сборку select?

ИЗМЕНИТЬ, чтобы включить section_controller.rb

class SectionsController < ApplicationController
  before_action :set_section, only: [:show, :edit, :update, :destroy]

  # GET /sections
  # GET /sections.json
  def index
    @sections = Section.all
  end

  # GET /sections/1
  # GET /sections/1.json
  def show
  end

  # GET /sections/new
  def new
    @section = Section.new
  end

  # GET /sections/1/edit
  def edit
  end

  # POST /sections
  # POST /sections.json
  def create
    @section = Section.new(section_params)

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

  # PATCH/PUT /sections/1
  # PATCH/PUT /sections/1.json
  def update
    respond_to do |format|
      if @section.update(section_params)
        format.html { redirect_to @section, notice: 'Section was successfully updated.' }
        format.json { render :show, status: :ok, location: @section }
      else
        format.html { render :edit }
        format.json { render json: @section.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /sections/1
  # DELETE /sections/1.json
  def destroy
    @section.destroy
    respond_to do |format|
      format.html { redirect_to sections_url, notice: 'Section was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_section
      @section = Section.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def section_params
      params.require(:section).permit(:semester, :number, :course, :room_number)
    end
end

Я считаю, что мне нужно как-то связать их с последней частью:

 def section_params
          params.require(:section).permit(:semester, :number, :course, :room_number)

РЕДАКТИРОВАТЬ:
(источник: rubyisonrails.com)
http://rubyisonrails.com/pictures/part2.PNG ">

0
anybodii 23 Сен 2018 в 21:20

1 ответ

Лучший ответ

Во-первых, вы должны изменить courses на course в модели Section. Название ассоциации для belongs_to всегда должно быть единственного числа .

class Section < ApplicationRecord
  belongs_to :course #singular name
end

Во-вторых, у вас должен быть столбец course_id вместо, конечно, в таблице разделов. Вы можете создать миграцию, которая отразит эти изменения в таблице.

rails g migration modify_sections

Приведенная выше команда должна создать файл типа xxxxxxxmodify_sections.rb в папке db/migrate. Откройте файл и добавьте

def change
  add_column :sections, :course_id, :integer
  remove_column :sections, :course, :integer
end

И сделай rake db:migrate

Теперь измените collection_select, как показано ниже

<%= form.collection_select(:course_id, Course.all, :id, :name) %>

И в sections_controller#create добавьте

@section.course_id = params[:section][:course_id]

Перед respond_to do |format|

Наконец, замените course на course_id в методе section_params.

def section_params
  params.require(:section).permit(:semester, :number, :course_id, :room_number)
end

Примечание.

Поскольку вы новичок в этой технологии, я рекомендую вам следовать Руководствам . учить.

0
Pavan 23 Сен 2018 в 20:20