Rails表单复选框或为多个数组选择数组值

时间:2017-01-07 13:35:34

标签: ruby-on-rails arrays forms ruby-on-rails-3 activerecord

我正在维护一个Rails 3.2.22.5遗留应用程序并创建一个表单来向用户内部发送消息(在这种情况下,它们被称为医务人员)。这是我目前的表格。

<%= form_for(@mass_message, url: '/mass_messaging', method: 'post') do |f| %>
  <%= f.text_field :subject, placeholder: "Subject" %>
  <%= f.text_area :body, placeholder: "Body of message"%>
  <%= f.label :medic %>
  <%= f.select(:medic_ids, medic_select,  {}, {:multiple => true, :class => 'select'}) %>
  <%= f.button "Submit" %>

<% end %>

这种方法很好但我希望能够通过division列将Medics组拖到对象的medic_ids数组中。

当我执行以下操作时从控制台:

m = MassMessage.new
m.medic_ids = Medic.where(division: "Dallas").map {|medic| medic.id}
m.save

它将获取从where子句映射的id并将它们正确地注入medic_ids数组,并在名为MassMessageMedic的连接表中正确创建记录。

但是,在这种形式中,我需要能够在表单中创建某种选择器甚至复选框,以选择其中有4个不同的部门。所以这是一个两部分问题真的

1。)鉴于这四个陈述(分部)

Medic.where(division: "Dallas").map {|medic| medic.id}
Medic.where(division: "Houston").map {|medic| medic.id}
Medic.where(division: "Beaumont").map {|medic| medic.id}
Medic.where(division: "Texoma").map {|medic| medic.id}

如何将这些构造成某种辅助方法,允许选择每个数组(一个或多个)并注入medic_ids数组?我正在尝试不同的事情,并且想到一个名为medic_select的辅助方法可能就是答案,但我正在如何创建这个选择器,如果我&#39基本上是一个数组的数组。 ;没错。

2。)鉴于上面的数组,我怎么能代替表单中的选择器使用check_box来定义当单击复选框时,通过除法选择适当的医生。这是我尝试的一个例子,但我收到了错误:

  <%= f.label :houston %>
  <%= f.check_box :medic_ids, Medic.where(division: "Houston").map {|medic| medic.id} %>
  <%= f.label :dallas %>
  <%= f.check_box :medic_ids, Medic.where(division: "Dallas").map {|medic| medic.id} %>

我收到的错误是: undefined method合并&#39;对于#`当试图这样做时。

我很确定这可以做到,但经过一个小时的搜索和尝试不同的事情,我真的没有比开始时更进一步。

我希望有人能指出我正确的方向。

与此同时,我将继续谷歌并研究Stack,看看其他人是否有类似的问题。

如果我的代码和/或问题不简洁或明确,请告诉我,我会编辑。

更新

我意识到form_for有局限性,我决定切换到form_tag,以便我可以使用控制器中的参数。这是我的代码现在的样子。

mass_messaging_controller.rb

  def create
    @mass_message = current_user.mass_messages.new
    @mass_message.subject = params[:subject]
    @mass_message.body = params[:body]
    @mass_message.medic_ids = params[:medic_ids]
    if @mass_message.save
      redirect_to mass_messaging_index_path, notice: "Your message has been queued for processing"
    else
      Rails.logger.info(@mass_message.errors.inspect)
      redirect_to mass_messaging_index_path, notice: "Your messasge failed to send"
    end
  end

form.html.erb

<%= form_tag('/mass_messaging', :method=>'post') do %>
 <p>
   Subject:<br />
   <%= text_field_tag "subject" %>
 </p>
 <p>
   Body:<br />
   <%= text_area_tag "body", "", :size=>"50x20" %>
 </p>
 <p>
   Divison: <br />
   <%= select_tag("medic_ids", options_for_select([['Houston', houston],
                 ['Dallas', dallas], ['Beumont', beaumont], ['Texoma', texoma]])) %>
 </p>
 <p>
   <%= submit_tag 'Submit' %>
 </p>
<% end %>

mass_messaging_helper

  def houston
    Medic.where(division: "Houston").map {|medic| medic.id}
  end

  def dallas
    Medic.where(division: "Dallas").map {|medic| medic.id}
  end

  def texoma
    Medic.where(division: "Texoma").map {|medic| medic.id}
  end

  def beaumont
    Medic.where(division: "Beaumont").map {|medic| medic.id}
  end

当我提交表单时,它会正确传递params,就像在这个例子中一样,但是我引发了一个异常:这里是developer.log的摘录

    Started POST "/mass_messaging" for 127.0.0.1 at 2017-01-07 12:31:47 -0600
    Processing by MassMessagingController#create as HTML
      Parameters: {"utf8"=>"✓", "authenticity_token"=>"MVfjUe901TYuXbwDgMWSzCsf9T7KI7UvzKkiYEKqpJU=", "subject"=>"", "body"=>"", "medic_ids"=>"[304, 635, 472, 349, 683, 702, 588, 486, 593, 492, 645, 536, 685, 686, 410, 417, 573, 564, 567, 678, 651, 474, 734, 408, 718]", "commit"=>"Submit"}
      User Load (0.6ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1
      Medic Load (0.7ms)  SELECT "medics".* FROM "medics" WHERE "medics"."id" = $1 LIMIT 1  [["id", 0]]
    Completed 404 Not Found in 6.0ms
ActiveRecord::RecordNotFound - Couldn't find Medic with id=0:

所以我觉得我在这个方面取得了进展并且走在了正确的轨道上,但是我不知道它装载了一个ID为0的医生是什么,因为我不喜欢#&# 39;在param hash中看到它。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

我最终通过使用我的更新代码并包装params[:medic_ids] in eval()`来评估字符串内部的数组。这与我的form_tag重写一起工作就是我需要它。