我正在维护一个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中看到它。
有什么建议吗?
答案 0 :(得分:0)
我最终通过使用我的更新代码并包装params[:medic_ids] in
eval()`来评估字符串内部的数组。这与我的form_tag重写一起工作就是我需要它。