我正在使用Rails应用程序,该应用程序允许用户查看和创建动物。用户可以添加动物的名称和“范围”,其中包括以下内容:
models / Animal.rb
class Animal < ApplicationRecord
has_one :range
validates :name, presence:true, length: {minimum:1}
validates :name, :presence => true, :uniqueness => true
end
models / Range.rb
class Range < ApplicationRecord
has_many :animals
end
seeds.rb
ranges = [
{id: 1, name: "land"},
{id: 2, name: "sea"},
{id: 3, name: "air"},
{id: 4, name: "underground"}
]
animals = [
{id: 1, name: "dolphin", range_id: 2, range: "sea"},
{id: 2, name: "ant", range_id: 4, range: "underground"},
{id: 3, name: "eagle", range_id: 3, range: "air"}
]
range.id/animal.range_id和range.name和animal.range通过外键和关联连接。
这是我当前的animals_controller.rb
class AnimalsController < ApplicationController
def index
@animals = Animal.all
if params[:search]
@animal = Animal.search(params[:search]).order("created_at DESC")
else
@animals = Animal.all.order("created_at DESC")
end
end
def show
@animal = Animal.find(params[:id])
end
def new
@animal = Animal.new
end
def create
# render plain: animal_params[:animal].inspect
@animal = Animal.new(animal_params)
if(@animal.save)
redirect_to @animal
end
private def animal_params
params.require(:animal).permit(:id, :name, :range, :range_id)
end
end
现在是问题所在。我用于Animal.new的表单帮助器具有一个选择框,该选择框应自动保存动物的范围ID和范围名称。但是,它会将范围名称另存为直接链接到范围/显示页面。
<h1> Add Animal </h1>
<%= form_for :animal, url: animals_path do |f| %>
<p>
<%= f.label :name %> <br>
<%= f.text_field :name %>
</p>
<p>
<%= f.label :range_name %> <br>
<%= f.select :range_id, options_for_select(Range.all.collect { |range| [range.name, range.id]}), {}, class: 'form-control', include_blank: 'Please Select' %>
</p>
<p>
<%= f.submit %>
<p>
<% end %>
因此,当我去保存新动物时,会得到类似的东西。范围应显示为“土地”,而不仅仅是保存为指向范围/显示页面的链接。
Name: cat
range: range/1
我需要改为说“土地”。我在这里做错了什么?我怀疑这与表单帮助程序有关,但是我找不到确切的答案。
答案 0 :(得分:0)
一件事,您应该只在动物模型中设置range_id
:
<%= f.label :rang_id, 'Range' %> <br>
<%= collection_select(:animal, :range_id, Range.all, :id, :name, {:prompt => 'Please select'}, class: 'form-control' ) %>
我还认为您希望Animal.rb具有以下关系:
belongs_to :range
如上面的注释中所述,问题可能是您用来显示范围的代码。如果您添加了save
调用的Web服务器日志,并显示了用于显示range
的html.erb代码。