【问题标题】:Rails Form Check Box or select Array value for multiple arraysRails 表单复选框或选择多个数组的数组值
【发布时间】:2017-01-07 13:35:33
【问题描述】:

我正在维护一个 Rails 3.2.22.5 旧版应用程序并创建一个表单以在内部向用户发送消息(在这种情况下,他们称为 medics)。这是我的表单目前的样子。

<%= 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 列将医疗组组铲入对象上的 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 的辅助方法可能是答案,但我正在尝试如何创建这个选择器,如果我没记错的话,它本质上是一个数组数组。

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 methodmerge' for #` 尝试这样做时。

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

我希望有人可以为我指明正确的方向。

与此同时,我将继续使用 Google 和研究 Stack,看看其他人是否有类似的问题。

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

更新

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

ma​​ss_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 %>

ma​​ss_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

当我提交表单时,它会像本示例一样正确传递参数,但我会引发异常:这是 development.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 的 medic 是什么,因为我在 param 哈希中看不到它。

有什么建议吗?

【问题讨论】:

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


    【解决方案1】:

    我最终通过使用我更新的代码并包装params[:medic_ids] ineval()` 来评估字符串内的数组,从而使这个工作正常进行。这与我的 form_tag 重写一起工作,正是我所需要的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-17
      • 2018-06-03
      • 2010-12-06
      相关资源
      最近更新 更多