Rails - 在表单下拉列表中显示与用户相关的对象

Rails - Show objects related to user in form dropdown

在我的 rails 应用程序中存在以下关系: user belongs_to :team , element belongs_to :team , task belongs_to :element

然后用户可以创建属于某个元素的任务。 当用户创建任务时,他们可以 select 他们希望任务所属的元素。如何只显示属于 current_user 团队的元素?我正在使用 Devise 获取 current_user.

下面的示例不起作用。

  <div class="field">
    <%= form.label :element_id %>
    <%= form.select :element_id, options_for_select(Element.current_user.team_id.map{|s|[s.title, s.id]}),{ :multiple => true} %>
  </div>

我也尝试从 tasks_controller.rb 文件中调用下面的方法,但它也没有用

  def new
    @task = Task.new
    @tasks_element_dropdown = Element.current_user.team_id.map{|s|[s.title, s.id]}
  end

tasks/_form.html.erb文件中,我用下面的代码调用了方法

<%= form.select :element_id, options_for_select(@tasks_element_dropdown),{ :multiple => true} %>

当我尝试下面的示例时它确实有效但它显示了所有元素,我只希望显示属于用户团队的元素

  <div class="field">
    <%= form.label :element_id %>
    <%= form.select :element_id, options_for_select(Element.all.map{|s|[s.title, s.id]}),{ :multiple => true} %>
  </div>

问题出在下面的代码中,应该return elements:

Element.current_user.team_id.map{|s|[s.title, s.id]}

既然你有一个user,你可以得到球队:current_user.team 然后得到teamelements(只要在Teamclass中定义了has_many :elements):current_user.team.elements

因此,最终代码应该是这样的:

<div class="field">
  <%= form.label :element_id %>
  <%= form.select :element_id, options_for_select(current_user.team.elements.map{ |s| [s.title, s.id] }),{ :multiple => true} %>
</div>