如何通过关联使用Rails has_many的单个选择下拉列表?

时间:2018-01-16 16:11:18

标签: ruby-on-rails ruby forms activerecord drop-down-menu

我无法弄清楚如何通过关联工作获得Rails has_many的单个选择下拉列表。我只能获得多个复选框或多个选择才能工作。

如果您希望用户只能通过单个选择下拉列表从关联集合中选择一个选项,那么如何通过关系获得rails has_many?

以下是我的模特

class Artist < ApplicationRecord
  has_many :topics
  has_many :quotes, through: :topics
end

class Topic < ApplicationRecord
  belongs_to :artist
  belongs_to :quote
end

class Quote < ApplicationRecord
  has_many :topics
  has_many :artists, through: :topics
end

这是我在报价控制器中的创建操作和参数:

  def create
    @quote = current_user.quotes.build(quote_params)
    if @quote.save
      flash[:success] = "Quote created!"
      redirect_to root_url
    else
      @feed_items = []
      render 'static_pages/home'
    end
  end

以下是有效的表单字段:

<%= f.collection_select(:artist_ids, Artist.all, :id, :name,
      {}, { :multiple => true } ) %>

<%= f.collection_check_boxes(:artist_ids, Artist.all, :id, :name ) %>

如果我使用它来制作一个选择下拉列表,它只显示带有正确集合的下拉列表,但是它似乎不会保存在提交中并且不会在视图中显示:

<%= f.collection_select(:artist_ids, Artist.all, :id, :name ) %>

对于有效的两个表单字段,我可以在视图中显示结果:

<% quote.artists.each do |artist| %>
  <%= artist.name %> - It worked!
<% end %>

但我不想要多选下拉列表。我只想要一个下拉列表,您只能选择并提交一个选项。你是怎么做到的?

2 个答案:

答案 0 :(得分:1)

是的!确切地说,我有同样的问题,但我已经通过使用自己的技巧解决了,请参阅下面的代码

<div class="form-group">
    <label>Artist</label>
    <select name="quote[artist_ids][]" id="quote_artist_ids" class="form-control">
        <% Artist.all.each do |artist| %>
            <option value="<%= artist.id %>">
                <%= artist.name %>
            </option>
        <% end %>
    </select>
</div>

它正在工作,没有这一切,所有内容都是相同的:quote_params我的意思是所有的都是相同的,然后才能工作多次。

希望能提供帮助

答案 1 :(得分:0)

这是Ruby on Rails的正确方法:

import numpy as np

grid = np.random.randint(-50, 50, size=(5, 4))
i_list = np.array([[1, -1, 2, -2]])


def sum_text(x: int, y: int):
     return f'{x}+{y}'


# create a ufunc, telling numpy that it takes 2 arguments and returns 1 value
np_sum_text = np.frompyfunc(sum_text, 2, 1)

result = np_sum_text(grid, i_list)
print(result)