Как я могу передать дополнительную информацию от элементов simpleForm к моему контроллеру в рельсах

Я использую SimpleForm в Rails, и у меня есть 2 поля, представленные пользователю, чтобы выбрать местоположение (богатую ассоциацию) из предварительно отфильтрованного набора Locations. Каждый выбор должен быть сохранен в соединительной таблице вместе с типом местоположения, в котором он находится.

Как я могу создать форму, которая будет отправлять обратно информацию на мой контроллер, который может сказать мне, какой тип местоположения выбирается.

_new_flow_form.html

      <%= simple_form_for @new_flow,:url => {:action => "company_create_flow", :controller => 'flows'}, :html => { :class => 'form-horizontal', :multipart => true } do |f| %>

            <%= f.label 'Workflow Title', :class => 'control-label' %>
            <%= f.text_field :title, :class => 'form-control' %>

            <%= f.association :locations, collection: Location.where(:company_id => @company.id, :source => 'TRUE'), :label => 'Source Location' %>
            <%= f.association :locations, collection: Location.where(:company_id => @company.id, :destination => 'TRUE'), :label => 'Destinations'%>

            <%= f.submit nil, :class => 'btn btn-primary' %>
      <% end %>

Для справки, мои модели выглядят так:

location.rb

  class Flow < ActiveRecord::Base
    has_many :flow_locations
    has_many :locations, :through => :flow_locations
  end

flow.rb

  class Location < ActiveRecord::Base
    has_many :flow_locations
    has_many :flows, :through => :flow_locations
  end

flow_location.rb

  class FlowLocation < ActiveRecord::Base
    belongs_to :flow
    belongs_to :location

    serialize :source
    serialize :destination
  end

Текущий результат, который я получаю при отправке формы:

{
"utf8": "✓",
"authenticity_token": "Z3f4lByIebmvz4wgFGQGPP7xoVeLIFgSE0MSak9KfZxP3yoH7SFBjH5upD+mx+pRZ61bXqwl+e2o3qEX3dfYAw==",
"flow": {
    "title": "testMe",
    "company_id": "1",
    "service_ids": [
        "",
        "2"
    ],
    "location_ids": [
        "",
        "3",
        "",
        "1"
    ]
},
"commit": "Create Flow"
}

И главная проблема здесь заключается в том, что у меня нет никакого способа понять из этого, какие из этих location_ids предназначены для "Источников", а какие для "Назначений"

Может ли кто-нибудь помочь мне понять, что я мог бы сделать здесь по-другому, чтобы получить что-то лучшее из представления, которое может сказать мне конкретно, какой location_id для чего?

1 ответ

Решение

Вы можете просто изменить name атрибут элементов HTML:

<%= f.association :locations, collection: Location.where(:company_id => @company.id, :source => 'TRUE'), :label => 'Source Location' name: "source_ids" %>
<%= f.association :locations, collection: Location.where(:company_id => @company.id, :destination => 'TRUE'), :label => 'Destinations' name: "destination_ids"%>

Но это вытолкнет атрибут из flow объект

{
"utf8": "✓",
"authenticity_token": "Z3f4lByIebmvz4wgFGQGPP7xoVeLIFgSE0MSak9KfZxP3yoH7SFBjH5upD+mx+pRZ61bXqwl+e2o3qEX3dfYAw==",
"flow": {
    "title": "testMe",
    "company_id": "1",
    "service_ids": [
        "",
        "2"
    ]    },
"commit": "Create Flow",
"source_ids":[
    "1"
 ],
"destination_ids":[
    "3"
 ]
}

ИЛИ ЖЕ

В Rails 4 вы можете использовать ассоциацию с Flow модель:

class Flow < ActiveRecord::Base
  has_many :flow_locations
  has_many :destinations, -> { destinations: true }, :class_name => 'Location', :through => :flow_locations
  has_many :sources, -> { source: true }, :class_name => 'Location', :through => :flow_locations
  has_many :destinations, 
end

и обновить ваш взгляд _new_flow_form.html соответственно:

<%= f.association :sources, collection: Location.where(:company_id => @company.id, :source => 'TRUE'), :label => 'Source Location' %>
<%= f.association :destinations, collection: Location.where(:company_id => @company.id, :destination => 'TRUE'), :label => 'Destinations'%>
Другие вопросы по тегам