Rails:窗体助手不能正确保存参数

时间:2018-08-13 23:21:31

标签: ruby-on-rails ruby forms parameters controller

我正在使用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 

我需要改为说“土地”。我在这里做错了什么?我怀疑这与表单帮助程序有关,但是我找不到确切的答案。

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代码。