【发布时间】: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,以便可以使用控制器中的参数。这是我的代码现在的样子。
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
当我提交表单时,它会像本示例一样正确传递参数,但我会引发异常:这是 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