如何在Rails中创建新事件时保存位置的新记录

时间:2015-10-07 11:13:14

标签: ruby-on-rails belongs-to

请参阅下面的解决方案

所以我有两个模型,其中一个事件属于某个位置。由于我没有计划为地点建立管理,我希望用户选择现有位置或为他提供文本字段以动态创建新位置。我知道需要做一些事情来保存(或者在之前的过滤器中),但由于缺乏相关搜索术语的知识,我的搜索没有产生解决方案(这种模式是什么)叫什么?)

任何方式,一些相关的代码:

#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

但我不知道如何调整创建动作,以便:

  • 保存location_id(如果已设置
  • 如果不是
  • ,则保存新位置
  • 还以
  • 的形式尊重验证规则(并以其显示)
  • 使用正确的(新)location_id
  • 更新/保存活动

感谢。

解决方案,必须以不同方式解决参数

所以我在控制台玩了一下,发现可以将相关模型保存在一个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

0 个答案:

没有答案