【问题标题】:Rails 5: Populate Dropdown List from Database with options_from_collection_for_selectRails 5:使用 options_from_collection_for_select 从数据库填充下拉列表
【发布时间】:2016-11-02 04:15:38
【问题描述】:

我是 Rails 新手,已阅读有关下拉菜单的文档,但仍在苦苦挣扎。

我有一个数据库如下:

                        Table "public.lakeaddresses"
Column  |         Type          | Modifiers | Storage  | Stats target | Description
---------+-----------------------+-----------+----------+--------------+-------------
 address | character varying(40) |           | extended |              |
 city    | character varying(25) |           | extended |              |
 state   | character varying(20) |           | extended |              |
 zip     | integer               |           | plain    |              |
 county  | character varying(25) |           | extended |              |
 lake    | character varying(30) |           | extended |              |
 lakeid  | integer               |           | plain    |              |

我想创建一个填充湖泊名称的下拉列表,即“湖”列

views/map/index.html.erb

<head>
<script src='https://api.mapbox.com/mapbox-gl-js/v0.26.0/mapbox-gl.js'>    
</script>
<link href='/home/garrett/lakemag/app/assets/stylesheets/lakemap.css' rel='stylesheet' />
</head>          

<body>
<div  id='map' style='margin:0 auto; width: 1024px; height: 768px;'>
<script>
  mapboxgl.accessToken = 'pk.eyJ1IjoiZ3JhZmZpbmR1c3RyaWVzIiwiYSI6ImNpdXAxY2pycjAxeGoyb251dDY2emNqeXgifQ.YtJkR5Elp-oq3FaMTUlXyw';
  var map = new mapboxgl.Map({
    container: 'map',
    style: 'mapbox://styles/graffindustries/ciursnqrv009u2js5cpedcnsr'
  });
</script>
</div>

</br></br>

<center>

<% form_tag(method: "get") do %>
  <% lake_array = Lake.all.map { |lake| [lake.name] } %>
  <= select_tag 'Lake Name', options_for_select(lake_array) %>
<% end %>

</center>
</body>

控制器/map_controller.rb

def new
@lake = Lake.all

收到错误:

ActionView::Template::Error (uninitialized constant ActionView::CompiledTemplates::Lake
18:
19: <center>
20:
21: <% form_tag(method: "get") do %>
22: <% lake_array = Lake.all.map { |lake| [lake.name] } %>
23: <= select_tag 'Lake Name', options_for_select(lake_array) %>
24: <% end %>
25:
26: </center>
F, [2016-11-02T06:22:04.619269 #7096] FATAL -- : [f4086edc-8de8-4b36-9b81-4a20efbde333] app/views/map/index.html.erb:21:in `_app_views_map_index_html_erb___3432893749292109102_24860500'

【问题讨论】:

  • 你能发布你的整个视图文件吗?
  • 我已经更新了视图文件。页面上的地图代码工作正常 - 但是一旦我添加了表单的代​​码,它就会破坏页面。谢谢回复

标签: ruby-on-rails forms activerecord


【解决方案1】:

而不是&lt;% options = options_from_collection_for_select(@lake, 'lake') %&gt;

尝试以这种方式建立您的阵列。

<% lake_array = Map.all.map { |map| [map.lake] } %>
<%= select_tag 'Lake Name', options_for_select(lake_array) %>

请注意,除非您使用form_for,否则您不能使用f.select,而必须使用select_tag

更新:您收到错误是因为 lake 派生自 map 表。如果你有一个 lake.rb 模型和表格列 name 你可以在你的 Rails 控制台中做这样的事情。

lake = Lake.first
lake_name = lake.name

但是现在,因为你不能像这样访问Lake.method,你必须通过你的Map来访问它。因此,例如,为了访问您的某个湖泊名称,您必须在您的 Rails 控制台中执行此操作。

map = Map.first
lake_name = map.lake 
#this would return the lake that is tied to the first map object

希望这可以消除您的疑虑并解释您收到错误的原因。

【讨论】:

  • 您好,我已经尝试了您的解决方案,但现在遇到了一个新错误。我已经更新了我的错误文件响应以及原始帖子中的视图文件。感谢您抽出宝贵时间回复我的问题
  • 您的表单需要包含在form_tag 中,而不仅仅是直接包含在您的index.html.erb 视图中。请仔细阅读表格,而不仅仅是select标签
  • 我已经用 form_tag 开始和结束更新了我的视图代码。你能告诉我我是否走在正确的轨道上吗?
  • 技术上是的,尽管这取决于您的表单/选择标签的目的。
  • 我了解 form_for 期望从模型构建表单。我对为什么收到错误感到困惑:ActionView::Template::Error (uninitialized constant ActionView::CompiledTemplates::Lake
猜你喜欢
  • 2014-12-25
  • 2017-03-12
  • 2011-11-09
  • 2018-10-03
  • 2016-01-09
  • 1970-01-01
相关资源
最近更新 更多