如何为此方案呈现collection_check_box

时间:2016-05-12 22:18:12

标签: ruby-on-rails forms mongodb mongoid

我是mongodb的新手,并尝试使用Rails学习。我正在使用mongoid gem。 所以我的应用程序有一个用户资源,应该有一个名称,电子邮件,地址和订阅。 名称,电子邮件和地址字段可以采用用户希望键入的任何值。但是,订阅是从可用订阅的主列表中选择的。我必须为可用的订阅呈现collection_check_boxes,并且用户选择他想要的内容并提交表单。 我是这样设计的,

用户模型

  • 名称:字符串

  • 电子邮件:字符串

  • 地址:字符串
  • 订阅:数组

订阅模式

  • 名称:字符串

除了Subscription提供用户表单中的可用订阅之外,这两个模型之间没有关系。 用户选择并提交表单后,订阅ID将作为数组存储在User模型中。 这一切都可以正常提交,但是当用户点击编辑以更改订阅我不知道或者我无法渲染collection_check_boxes并检查其原始订阅。 模型的创建方式是否存在设计缺陷?我无法使用像embeds_many,embedded_in这样的关系来解决上面的场景。

对于以下代码,当用户尝试编辑时,我会在编辑表单中收到此错误

undefined method `id' for "5733af2e54c870ee8190950b":String



  <div class="checkbox">
    <% if @user.new_record? %>
      <%= f.collection_check_boxes(:subscriptions, Subscription.all, :id, :name) do |b| %>
        <%= b.label class:"label-checkbox" do %>
          <%= b.check_box + b.text %>
            |
        <%end%>
      <% end %>
    <% else %>
      <%= f.collection_check_boxes(:subscriptions, Subscription.all, :id, :name,  { checked: @user.subscriptions.map(&:id) }) do |b| %>
        <%= b.label class:"label-checkbox" do %>
          <%= b.check_box + b.text %>
            |
        <%end%>
      <% end %>
    <% end %>
 </div>
&#13;
&#13;
&#13;

1 个答案:

答案 0 :(得分:0)

我想通了自己,所以收集复选框helper方法在返回的订阅上调用id方法。但是我将订阅ID存储为User模型中的字符串数组,它无法在字符串值上调用id方法。所以我在控制器中编写了一个辅助方法,以从Subscription模型返回实际的订阅对象。现在一切正常

  def get_subscriptions(user)
    Subscription.find(user.subscriptions)
  end
  helper_method :get_subscriptions

&#13;
&#13;
    <% if @user.new_record? %>
      <%= f.collection_check_boxes(:subscriptions, Subscription.all, :id, :name) do |b| %>
        <%= b.label class:"label-checkbox" do %>
          <%= b.check_box + b.text %>
            |
        <%end%>
      <% end %>
    <% else %>
      <%= f.collection_check_boxes(:subscriptions, Subscription.all, :id, :name,  { checked: get_subscriptions(@user).map(&:id) }) do |b| %>
        <%= b.label class:"label-checkbox" do %>
          <%= b.check_box + b.text %>
            |
        <%end%>
      <% end %>
    <% end %>
&#13;
&#13;
&#13;