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)。
我有两个模型:
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)。