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

时间:2018-07-17 08:04:20

标签: ruby-on-rails ruby devise associations relationship

在我的Rails应用程序中,存在以下关系: user belongs_to :teamelement belongs_to :teamtask belongs_to :element

然后,用户可以创建一个属于元素的任务。 用户创建任务时,可以选择他们希望任务属于的元素。如何仅显示属于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>

1 个答案:

答案 0 :(得分:0)

问题出在以下代码中,该代码应返回elements

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

由于您拥有user,因此可以得到团队:current_user.team 然后获取elements中的team(只要在has_many :elements类中定义了Team):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>