Как сделать ассоциации моделей между двумя моделями в Ruby.Или Как взять данные из одной модели и использовать их в другой модели? - PullRequest
0 голосов
/ 23 сентября 2018

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

То, что я изменил, чтобы сделать выпадающее меню, было (в _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

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

ПРАВКА, чтобы включить 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)

ПРАВКА: http://rubyisonrails.com/pictures/part1.PNG http://rubyisonrails.com/pictures/part2.PNG">

1 Ответ

0 голосов
/ 23 сентября 2018

Во-первых, вы должны изменить 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

Примечание:

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

...