【问题标题】:How to save Join Table with Ruby on Rails如何使用 Ruby on Rails 保存连接表
【发布时间】:2020-06-24 14:43:34
【问题描述】:

我正在尝试创建一个简单的应用程序,让用户可以保存司机、保存汽车并将它们组合起来(通过连接表)。

驱动器型号:

has_many :cars_drivers
has_many :cars, through: :cars_drivers

车型:

has_many :cars_drivers
has_many :drivers, through: :cars_drivers

cars_driver 型号:

belongs_to :car, optional: true
belongs_to :driver, optional: true

我想显示司机开过的所有汽车,所以我在drivers_controller上添加了这个:

def create
  @driver = Driver.new(driver_params)
  respond_to do |format|
    if @driver.save
      CarsDriver.where(driver_id: @driver.id).destroy_all
        form_cars_selected.each do |car_id|
          CarsDriver.create driver_id: @driver.id, car_id: car_id
        end
      format.html { redirect_to @driver, notice: 'Driver was successfully created.' }
      format.json { render :show, status: :created, location: @driver }
    else
      format.html { render :new }
      format.json { render json: @driver.errors, status: :unprocessable_entity }
    end
  end
end

这是在视图中:

<% if @driver.cars.blank? %>
  Driver has no cars.
<% else %>
  <%= @driver.cars.pluck(:description).to_sentence %>
<% end %> 

但它不起作用。我能错过什么?有没有更简单的方法可以在 RoR 中设置这种基本关系?

【问题讨论】:

  • 您能提供您的show 操作模板吗?最后一个代码块在哪里?
  • @VasiliyNovikov 是的,表演动作是空的:def show end。最后一个代码块位于 show.html.erb
  • 我想你遇到了@driver 变量没有重新加载,所以在视图中它不包含任何汽车。你可以像@driver.cars &lt;&lt; Car.where(id: form_cars_selected) 那样做,然后再@driver.save
  • @driver.update(car_ids: form_cars_selected)

标签: ruby-on-rails ruby sqlite


【解决方案1】:

new/editDriver 表单中,您可以添加multi select

<%= form.select :car_ids, Car.order(:name).map { |c| [c.name, c.id] }, {}, multiple: true %>

在控制器中允许car_ids: []patient_params

通过这种方式,您可以从 Driver 表单将汽车添加到 Driver


_ids= 是一个特殊的method,可让您创建连接模型

【讨论】:

  • 现在我在 DriversController#create 中遇到 NameError - undefined local variable or method `form_cars_selected' for #<0x00007f8b0>
猜你喜欢
  • 1970-01-01
  • 2011-05-10
  • 2010-10-20
  • 1970-01-01
  • 1970-01-01
  • 2011-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多