【问题标题】:Rails - form_for select that show my categories from dbRails - form_for 选择显示我从 db 中的类别
【发布时间】:2016-02-16 07:11:26
【问题描述】:

我有与我的类别相关联的页面
现在我有一个正在创建页面的表单

<%= form_for @page do |f| %>

<table>
    <tr>
        <td><%= f.label :title %></td>
        <td><%= f.text_field :title %></td>
    </tr>
    <tr>
        <td><%= f.label :desc %></td>
        <td><%= f.text_field :desc %></td>          
    </tr>
    <tr>
        <td><%= f.label :category_id %></td>
        <td><%= f.select(Page.all, :category_id, :title) %></td>            
    </tr>           
</table>    

<%= f.submit %> 


<% end %>

我正在尝试创建一个选择下拉列表,该下拉列表将显示我从数据库中获得的所有类别,在我选择一个之后,它会将我正在创建的页面分配给我从中选择的类别选择下拉菜单

【问题讨论】:

  • 那有什么问题??

标签: ruby-on-rails ruby-on-rails-4 ruby-on-rails-5 ruby-on-rails-6


【解决方案1】:

你应该使用

f.select :category, Category.pluck(:title, :id)

请注意,如果您的 rails 版本较低,则 4.x 您只能将pluck 与一列一起使用。

【讨论】:

  • 需要说明的是,在Rails 4之前,pluck只能使用一栏。
  • 如何在提交表单时将创建的页面分配给选定的类别?
  • @user4571629 这取决于您的数据库设计。一般来说,如果Page belongs_to :category,那么在pages 表中有一个category_id 列。因此,您只需执行f.select :category_id, Category.pluck(:title, :id) - 现在应该为您执行此操作
  • 是的,我有你提到的确切关系,它没有分配它,我试过这一行:
  • 确保您已将category_id 等参数列入白名单
【解决方案2】:

你需要根据这个改变你的选择标签。

<%= form_for @page do |f| %>

<table>
<tr>
    <td><%= f.label :title %></td>
    <td><%= f.text_field :title %></td>
</tr>
<tr>
    <td><%= f.label :desc %></td>
    <td><%= f.text_field :desc %></td>          
</tr>
<tr>
    <td><%= f.label :category %></td>
    <td><%= f.select(:category_id, options_from_collection_for_select(Category.all, :category_id, :title)) %></td>            
</tr>           

【讨论】:

  • 这显示了页面,但我想要一个我的类别列表
【解决方案3】:

对于 Rails3(或者可能更少),如果你有一个 Category 模型,你可以简单地做到。

f.select(:category, Category.select([:id,:title]).map { |c| [ c.id, c.title ] } , { include_blank: true })

【讨论】:

  • 使用 Ruby 进行数据库处理是一个非常糟糕的主意。
  • @AndreyDeineko 我不知道,我经常这样做。你在幕后使用了pluck 它也是ruby 不是吗...这只是一种速记方法。
  • pluck 对数据库进行操作。您的解决方案将在任何计算之前加载整个类别集合,如果有大量 caegories,这很容易导致内存过载
  • 是的,我刚看到.. 非常感谢老兄。
  • @AndreyDeineko 我更擅长 Rails3 并且 pluck 在其中不可用.. 我已经更新了我的代码
【解决方案4】:

collection_select 是你需要的:

<%= form_for @page do |f| %>
  <%= f.collection_select :category_id, Category.all, :id, :title %>          
  <%= f.submit %>
<% end %>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    • 1970-01-01
    • 1970-01-01
    • 2015-08-13
    • 1970-01-01
    • 2020-05-06
    • 1970-01-01
    相关资源
    最近更新 更多