Rails 从外国模型的动态下拉列表中保存的值不起作用

Rails saving value from dynamic dropdown of foreign model not working

我有两个模型:

class Location < ActiveRecord::Base
    has_many :cows
    accepts_nested_attributes_for :cows
end

class Cow < ActiveRecord::Base
    belongs_to :location
end

每个位置都有一个 ID 和一个名称。一头牛由一个id、两个字符串和两个日期组成,还包括一个location_id.

在我的母牛视图中,我有每个位置的下拉列表。每当我创建、编辑或删除位置时,它都会自动更新。当我从下拉列表中选择一个位置时,奶牛指数会根据奶牛中的拟合 location_id 发生变化。

奶牛index.html.erb:

<!-- Dropdown Button -->
<a class='dropdown-button' href='#' data-activates='dropdown_locations'>
<i class="fa fa-arrow-down" aria-hidden="true"></i> Ort auswählen</a>

<!-- Dropdown Content -->
<ul id='dropdown_locations' class='dropdown-content'>
  <% @locations_all.each do |loc| %>
    <li><%= link_to loc.name, cows_path(location: loc.id) %></li>
  <% end %>
</ul>

奶牛指数页面是展示内容的同时增加新值的页面。正如我所提到的,索引会根据所选位置而变化。但它只有在我在数据库编辑器中手动填充奶牛 table 时才有效,因为从下拉列表中选择的位置不会保存到奶牛。

这是在奶牛中创建新奶牛的表格index.html.erb:

<%= simple_form_for Cow.new do |f| %>
    <%= f.input :ohrmarke, as: :string, input_html: { maxlength: 5 } %>
    <%= f.input :stallnummer, as: :string, input_html: { maxlength: 3 } %>
    <%= f.hidden_field :location_id, value: @location_id %>

    <button class="btn waves-effect waves-light" type="submit" name="action">Zuordnung speichern</button>
<% end %>

我使用 hidden_field 作为 location_id,值应该是从保管箱中选择的位置的 location_id。

但是由于某些原因,创建新奶牛是行不通的。这是我的奶牛控制器(缩写):

def index
  @locations_all = Location.all
  if (params[:location] && cows = Cow.where(location_id: params[:location]))
    @cows = cows
    @location = Location.where(id: params[:location])
  else
    @cows = Cow.all
  end
end

def new
  @cow = Cow.new
end

def create
  @cow = Cow.new(cow_params)

  respond_to do |format|
    if @cow.save
      # format.html blabla... the usual stuff
    end
  end
end

private
  def set_cow
    @cow = Cow.find(params[:id])
  end

  def cow_params
    params.require(:cow).permit(:ohrmarke, :hin, :weg, :stallnummer, location_attributes: [:location_id])
  end
end

我认为我的 hidden_field 或创建控制器无法正常工作。但我不知道我做错了什么。至少根据所选位置更改索引是可行的。提前感谢您的帮助。


编辑:我在你的帮助下自己解决了这个问题,请看我的回答。

主要问题是您已经说过 Location accepts_nested_attributes_for for :cows,但是您的表单和控制器设置为 Cow accepts_nested_attributes_for :location. 我想如果您将模型更改为

class Location < ActiveRecord::Base
has_many :cows

end

class Cow < ActiveRecord::Base
    belongs_to :location
    accepts_nested_attributes_for :location
end

你应该去某个地方。

我认为你没有设置位置

def cow_params
  params.require(:cow).permit(:ohrmarke, :hin, :weg, :stallnummer, location_attributes: [:location_id])
end

应该是

def cow_params
  params.require(:cow).permit(:ohrmarke, :hin, :weg, :stallnummer, :location_id)
end

该位置没有 location_id。我想你只是想把它放在牛身上。

根据一些建议,我更改了代码并设置了 location_id。现在一切正常。这是新代码:

奶牛控制器:

def index
  @locations_all = Location.all
  if (params[:location] && cows = Cow.where(location_id: params[:location]))
    @cows = cows
    @location_id = params[:location] # used for the form
    @location = Location.find(@location_id) # used for ex. showing the name
  else
    @cows = Cow.all
  end
end

def cow_params
  params.require(:cow).permit(:ohrmarke, :hin, :weg, :stallnummer, :location_id)
end

表格:

<%= f.hidden_field :location_id, value: @location_id %>

我也相应地更改了模型(将 nested_attributes 移动到 Cow)。