请参阅下面的解决方案
所以我有两个模型,其中一个事件属于某个位置。由于我没有计划为地点建立管理,我希望用户选择现有位置或为他提供文本字段以动态创建新位置。我知道需要做一些事情来保存(或者在之前的过滤器中),但由于缺乏相关搜索术语的知识,我的搜索没有产生解决方案(这种模式是什么)叫什么?)
任何方式,一些相关的代码:
#location.rb, does not have a controller
class Location < ActiveRecord::Base
has_many :events
end
#event.rb
class Event < ActiveRecord::Base
belongs_to :location, inverse_of: :events
accepts_nested_attributes_for :location
end
我发现了一些有关使用inverse_of:
和accept_nested_attributes_for
来创建表单的信息,但/ events / new的以下视图未显示任何字段:
.row
= form_for @event, html: { multipart: true } do |f|
.col-sm-8
.panel-heading
.panel-title Add / Edit Event
.panel-body
= render 'shared/error_messages', object: f.object if @event.errors.any?
.actions
= f.label :title
= f.text_field :title
#this generates the select for location
= f.label :location_id
= f.collection_select(:location_id, Location.all, :id, :title, prompt: "Please select or create a new location by completing the form below")
#this *should* generate a form for the location, but doesn't
= f.fields_for :location do |location|
= location.label :title
= location.text_field :title
有关让这个工作并保存相关模型的任何想法吗?
根据请求,event_controller
的非常简单的create和new方法 def new
@event = Event.new
end
def create
@event = current_user.events.build(event_params)
if @event.save
flash[:success] = "Event created!"
redirect_to events_path
else
render :new
end
end
编辑,更进一步
好的,现在还有一点点。当我将以下内容添加到我的新方法时,我会显示该表单:
def new
@event = Event.new
@location = @event.build_location
end
将调用调整为表单助手,如下所示:
= f.fields_for :location, @location do |location|
= location.label :title
= location.text_field :title
但我不知道如何调整创建动作,以便:
感谢。
解决方案,必须以不同方式解决参数
所以我在控制台玩了一下,发现可以将相关模型保存在一个save命令中。只有先决条件似乎是你以不同的方式调用params:
def create
@event = current_user.events.build(event_params)
if @event.save
flash[:success] = "Event created!"
redirect_to events_path
else
render :new
end
end
private
def event_params
params.require(:event).permit(:title, :content, :start_date, :end_date, :location_id, location_attributes: [:title])
end