我希望用户创建一个事件,在此事件上,他们需要能够为用户创建一个动态表单表单以“注册”该事件(动态创建字段)。然后提交到此表单的数据将存储在数据库中。我已经使用了本教程的大部分内容来了解我现在所处的位置。
到目前为止,我的结构看起来像这样:
class Admin::Event < ActiveRecord::Base
attr_accessible :body, :date, :title, :end_date, :status, :event_location_id, :payment, :fields_attributes, :answers
belongs_to :event_location
has_many :fields, class_name: "Admin::EventField"
has_many :event_surveys
accepts_nested_attributes_for :fields, allow_destroy: true
end
我已经能够成功地针对存储在 admin_event_fields 表中的事件动态创建字段。完全按照 Rails Cast 教程的方式完成。
class Admin::EventField < ActiveRecord::Base
belongs_to :event
attr_accessible :field_type, :name, :required
end
然后我有了这个模型,我的想法是将答案存储在哈希中;因此,当一个用户提交“调查”时,它会根据 admin_event_id 保存,然后答案将存储在答案哈希中。当另一个用户提交答案时,这应该重复......我的问题是,将答案保存到 Admin::EventSurvey......我无法找到一种合乎逻辑的方法来做到这一点。
class Admin::EventSurvey < ActiveRecord::Base
attr_accessible :admin_event_id, :answers
has_one :admin_event, :class_name => "Admin::Event"
accepts_nested_attributes_for :admin_event, :allow_destroy => true
serialize :answers, Hash
end
因为表单可以通过 show 操作提交,所以我在 show.html.erb 中放置了一个表单。
管理员::事件控制器:
# Admin::EventsController
# GET /events/1
# GET /events/1.json
def show
@event = Admin::Event.find(params[:id])
@event_survey_answer = Admin::EventSurvey.new(admin_event_id: params[:id])
respond_to do |format|
format.html # show.html.erb
format.json { render json: @event }
end
end
显示.html.erb:
<%= form_for @event_survey_answer do |f| %>
<% if @event_survey_answer.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@event_survey_answer.errors.count, "error") %> prohibited this event_survey_answer from being saved:</h2>
<ul>
<% @event_survey_answer.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<% f.fields_for :admin_event do %>
<%= @event.fields.each do |field| %>
<%= render "admin/events/fields/#{field.field_type}", locals: { field: field, f: builder } %>
<% end %>
<% end %>
<%= f.submit %>
<% end %>
目前出现上述错误,由于@event.fields 上的循环,我收到此错误:
undefined local variable or method `builder'