使用另一个控制器的模型信息填充Rails表单

时间:2012-08-07 18:13:39

标签: ruby-on-rails ruby-on-rails-3 forms ruby-on-rails-3.2

我已将SessionsController和会话模型重命名为句点/期间,因为它与Devise冲突,因此您会在更新中看到此内容

我有一个会话和事件模型/控制器。创建新会话时,需要将其与特定事件相关联。

在我的会话模型中,我有一个event_id,但是我希望在填充了非过去事件名称的表单上有一个下拉列表。选择后,表单应该能够将正确的event_id分配给创建的会话。

这样做的正确方法是什么?

这是我的schema.rb,可帮助您更清楚地了解模型的外观:

ActiveRecord::Schema.define(:version => 20120807154707) do

  create_table "events", :force => true do |t|
    t.string   "name"
    t.date     "date"
    t.string   "street"
    t.string   "city"
    t.string   "state"
    t.datetime "created_at", :null => false
    t.datetime "updated_at", :null => false
  end

  create_table "sessions", :force => true do |t|
    t.string   "name"
    t.integer  "event_id"
    t.datetime "created_at", :null => false
    t.datetime "updated_at", :null => false
  end

  create_table "users", :force => true do |t|
    t.string   "email",               :default => "",    :null => false
    t.string   "encrypted_password",  :default => "",    :null => false
    t.datetime "remember_created_at"
    t.integer  "sign_in_count",       :default => 0
    t.datetime "current_sign_in_at"
    t.datetime "last_sign_in_at"
    t.string   "current_sign_in_ip"
    t.string   "last_sign_in_ip"
    t.datetime "created_at",                             :null => false
    t.datetime "updated_at",                             :null => false
    t.boolean  "admin",               :default => false
  end

  add_index "users", ["email"], :name => "index_users_on_email", :unique => true

end

这是我的表格:

<%= form_for(@period)  do |f| %>


  <%= f.label :Name %>
  <%= f.text_field :name%>

  <%= f.label :Event %>
  <%= f.collection_select(:period, :event_id, Event.all, :id, :name)%>


  <%= f.label :time %>
  <%= f.text_field :time, id: "timepicker" %>

  <%= f.submit "Create Event" %>

<% end %>

我一直收到以下错误:undefined method merge'for:name:Symbol`

打破集合选择的各种参数:f.collection_select(:period, :event_id, Event.all, :id, :name)

:period -> The object
:event_id -> the method I want to set on the object.
Event.All -> The collection (for now I'll take all of them)
:id -> the value of the html element option
:name -> the value displayed to the user

我这样做是否正确?

2 个答案:

答案 0 :(得分:1)

要显示包含其他型号(而非其他控制器)选项的选择菜单,请尝试collection_select

在新的会话表单中,这可能如下所示:

collection_select(:event, :id, Event.where("date > :date", date: Time.now.strftime("%m/%d/%Y"))

在Sessions控制器中,在create操作中,构建如下关联:

@session.event = Event.find(params[:event][:id])

答案 1 :(得分:0)

我发现这个结构适合我:

    <%= f.label :event %>
        <%= f.collection_select :event_id, Event.all, :id, :name, {:prompt=> "Pick an Event"}, {:class => "form-control"} %>

最后一点是我用来设置Bootstrap类的html部分。

:name此处可以是:date:street等...