如何用Rails中的数据库值填充下拉列表选项?

时间:2018-07-23 02:11:49

标签: ruby-on-rails ruby

我有一个新手问题。

我有一个带有下拉列表的基本表单,如下所示:

## apply.html.erb

<%= form_for @category do |f| %>
 <%= f.label 'parent' , 'Category' %>
 <%= f.select :category, [["foo", 0 ], ["bar", 1 ]] %>
<% end %>

下拉列表值为"foo""bar"

我正在尝试直接从数据库中提取值。问题是我不知道如何组织controllermodel

这是控制器:

## Welcome_controller.rb
class WelcomeController < ApplicationController

  def index
  end

  def apply
    @category = 'foobar'
  end
end

我还没有生成控制器。在网上找不到我的问题或教程的任何令人信服的答案。

有什么想法可以实现吗?

**编辑**

所以我一直在做一些编辑。这就是我的内容:

视图

## apply.html.erb    
<%= form_for @category, as: :category do |f| %>
 <%= f.label 'Categories' %>
 <%= f.select :category, @category %>
<% end %>

控制器:

## welcome_controller.rb
def apply
    @category = Category.new
    @categories = Category.pluck(:id, :name)
  end

模型:

## Category.rb
class Category < ApplicationRecord
end

我在终端中得到以下内容:

ActionView::Template::Error (undefined method `categories_path' for #<#<Class:0x007ffb7c5a2808>:0x007ffb7c2814f8>):
    3: <div id="category_block">
    4:   <span>What would you like to get financed ?</span>
    5: 
    6:   <%= form_for @category, as: :category do |f| %>
    7:     <%= f.label 'Categories' %>
    8:     <%= f.select :category, @category %>
    9:   <% end %>

app/views/welcome/apply.html.erb:6:in `_app_views_welcome_apply_html_erb___747255529581383389_70359048261520'

问题似乎出自@category = Category.new,因为当我用Category.new之类的字符串替换' foobar'时,错误消失了。

您知道如何解决此问题吗?

1 个答案:

答案 0 :(得分:0)

您应该阅读有关documentation的更多信息。这是一个非常基本的问题,如果您花时间阅读和学习,您可能会得到答案。

也就是说,您提供的信息不足,所以我就假设。

首先,我假设您有一个Category模型。它应该放在app/models/category.rb中:

def Category
  ...
end

接下来,您实际上并没有从数据库中查询任何内容。您可以这样操作:

## app/controllers/welcome_controller.rb
class WelcomeController < ApplicationController

  def index
  end

  def apply
    @category = Category.new
    @categories = Category.pluck(:name, :id)
  end
end

Category.new生成Categorycategory.rb)对象的新实例。 Category.pluck(:name, :id)生成以下数组:[['foo', 1], ['bar', 2]],其中nameidCategory模型的属性(只需根据自己的喜好更改)。

一旦数组存储在@categories中,就可以像下面这样在表单中使用它:

## app/views/welcome/apply.html.erb

<%= form_for @category do |f| %>
 <%= f.label 'parent' %>
 <%= f.select :category, @categories %>
<% end %>

考虑到您有一个类别下拉列表,您可能不打算实际为Category创建一个表单,因此您应该将其更改为其他形式。另外,请注意文件名。它们都是小写字母,并由下划线分隔。 (Welcome_controller.rb应该是welcome_controller.rb

**编辑**

现在您已经向form_for添加了一个对象,除非您更改它,否则rails会自动为表单分配一个路径。在这种情况下,路径为categories_path。了解更多here

您需要做的是修改routes.rb并添加以下行:

resources :categories

该行将自动生成路由,该路由提供HTTP动词和URL之间到控制器动作的映射。

接下来,您需要创建一个CategoriesController

## app/controllers/categories_controller.rb
class CategoriesController < ApplicationController
  def create
    @category = Category.new(category_params)

    if @account_user.save
      redirect_to apply_path
    else
      render :new
    end
  end

  private

  def category_params
    params.require(:category).permit! # MODIFY THIS
  end
end

无论如何,这基本上是一个演练,您应该自己弄清楚。有很多资源-不难找到一个。您还可以查看以下内容:video