如何将有关easyForm元素的额外细节传递给rails中的控制器

时间:2015-10-10 09:31:36

标签: ruby-on-rails ruby ruby-on-rails-4 model-associations

我在Rails中使用SimpleForm,我向用户提供了两个字段,用于从预先过滤的一组位置中选择一个位置(一个丰富的关联)。每个选项都需要保存在连接表中以及它的位置类型。

如何创建一个表单,将表单发回给我的控制器,告诉我选择的“类型”位置。

 <item android:id="@+id/favorite"
    android:title="@string/favourite"        
    android:showAsAction="always"
    android:icon="@drawable/ic_favorite_white_24dp"
    />

<item
    android:id="@+id/action_overflow"
    android:orderInCategory="100"
    android:title="@string/action_settings"
    android:icon="@mipmap/options"
    app:showAsAction="always">
    <menu>
        <item
            android:id="@+id/action_my_music"
            app:showAsAction="ifRoom"
            android:title="My music" />
        <item
            android:id="@+id/action_friends"
            app:showAsAction="ifRoom"
            android:title="Friend`s music" />            
    </menu>
</item>

作为参考,我的模型看起来像这样:

location.rb

_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 %>

flow.rb

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

flow_location.rb

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

提交表单时我得到的当前结果是:

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

    serialize :source
    serialize :destination
  end

这里的主要问题是,我无法解释这些location_ids中的哪些是“来源”与哪些是“目的地”

任何人都可以帮助我理解我可以在这里做些什么,以便从可以告诉我具体哪个location_id的视图中找到更好的东西?

1 个答案:

答案 0 :(得分:0)

您只需更改HTML元素的name属性:

<%= 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'%>