【问题标题】:saving to multiple models from one form with rails使用导轨从一种形式保存到多个模型
【发布时间】:2012-02-18 01:14:00
【问题描述】:

在过去的几周里,我一直在研究 Rails,但我遇到了一个我找不到答案的问题。我觉得这可能是一件非常简单的事情,但它让我发疯,所以我希望得到一点指导......

我正在将 1 个表单中的数据插入 2 个模型。一种模型称为 Venue,一种模型称为 Events。这是一个一对多的关联,其中多个事件属于场馆,场馆有许多活动。

型号:

class Venue < ActiveRecord::Base
  has_many :events
  accepts_nested_attributes_for :events
end

class Event < ActiveRecord::Base
  belongs_to :venue

  scope :upcoming, where('date >= ?', Date.today)
 end  

控制器:

class EventsController < ApplicationController

def new
      @venue = Venue.new
end

def create

@venue = Venue.new(params[:venue])

    if @venue.save
        render :inline => "Success"
    else
        render('new')
    end
end

end

表格:

<%= form_for(@venue, :url =>{:action => 'create'}) do |f| %>

        Artist ID<br />
        <%= fields_for :event do |event_fields| %>
            <%= event_fields.text_field :artist_id %><br/><br />
        <% end %>

        Venue City<br />
        <%= f.text_field(:city) %> <br /><br />
        Venue Name<br />
        <%= f.text_field(:name) %><br/><br/>


        <div class="actions">
            <%= submit_tag "Save", :class => "btn primary" %>
        </div>

<% end %>

日志输出:

Started POST "/events" for 127.0.0.1 at 2012-02-17 19:57:24 -0500
Processing by EventsController#create as HTML
Parameters: {"utf8"=>"✓",   "authenticity_token"=>"p3llx5KsYn6gyjP9g2qwzXr+0rjh3h/o34h/iqvqjRo=", "event"=>{"artist_id"=>"124"}, "venue"=>{"city"=>" Boston", "name"=>"Bostons Fa'v"}, "commit"=>"Save"}
(0.2ms)  BEGIN
SQL (0.8ms)  INSERT INTO "venues" ("address_1", "address_2", "capacity", "city", "country", "created_at", "created_by", "name", "state", "updated_at", "url", "zip") VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12) RETURNING "id"  [["address_1", nil], ["address_2", nil], ["capacity", nil], ["city", " Boston"], ["country", nil], ["created_at", Sat, 18 Feb 2012 00:57:24 UTC +00:00], ["created_by", nil], ["name", "Bostons Fa'v"], ["state", nil], ["updated_at", Sat, 18 Feb 2012 00:57:24 UTC +00:00], ["url", nil], ["zip", nil]]
(0.4ms)  COMMIT
Rendered inline template (0.2ms)
Completed 200 OK in 5ms (Views: 0.6ms | ActiveRecord: 1.4ms)

您可以看到它没有失败,但它只提交给 1 模型。我的理解是,通过添加“accepts_nested_attributes_for :events”,Venue 模型知道然后转到我的事件表,使用我提供的事件数据创建一个新事件(在这个例子中只是艺术家 ID),然后自动插入我的 id 字段场地表进入场地_id。

我在这里想得越多,我就越觉得我可能错过了一步......如果有人有时间,我会很高兴听到你对此的思考过程。

谢谢

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 activerecord model-associations


    【解决方案1】:

    我认为您的表单中有语法错误。 fields_for 是 f 的一种方法,它需要一个复数符号。将块的迭代器设为单数也是一个好习惯,当您的方法只需要一个参数时不要使用括号:

    <%= form_for(@venue, :url =>{:action => 'create'}) do |f| %>
    
            Artist ID<br />
            <%= f.fields_for :events do |event_field| %>
                <%= event_field.text_field :artist_id %><br/><br />
            <% end %>
    
            Venue City<br />
            <%= f.text_field :city %> <br /><br />
            Venue Name<br />
            <%= f.text_field :name %><br/><br/>
    
    
            <div class="actions">
                <%= submit_tag "Save", :class => "btn primary" %>
            </div>
    
    <% end %>
    

    请参阅Ryan Bate's Railscasts 中的嵌套表单示例:

    <%= form_for @survey do |f| %>
      <%= f.error_messages %>
      <p>
        <%= f.label :name %><br />
        <%= f.text_field :name %>
      </p>
      <% f.fields_for :questions do |builder| %>
      <p>
        <%= builder.label :content, "Question" %><br />
        <%= builder.text_area :content, :rows => 3 %>
      </p>
      <% end %>
      <p><%= f.submit "Submit" %></p>
    <% end %>
    

    【讨论】:

    • 好的,谢谢,所以我添加了“f”。在 fields_for 前面并使 events 成为复数形式。当我重新加载表单时,不会生成 text_field。对您来说,这是否暗示该模型没有正确设置并且它没有找到场地和事件之间的关系?它无法同时生成事件和事件,仅供参考。谢谢
    • 我感觉我的问题与我的路线可能不正确有关,我现在正在调查。
    • 每个模型都有一个资源,它应该可以工作。我建议您观看我发布的截屏视频,Ryan 的解释非常简单易懂
    • 谢谢你,这是一个很大的帮助,我应该第一次看那个截屏视频。欣赏它。
    • 刚刚做了,谢谢....在我的控制器的新操作中路由问题和缺少@Venue = place.event.build 之间的一些事情的组合。再次感谢。
    【解决方案2】:

    Venue 模型需要指定哪些属性可以批量赋值,包括Event 属性。

    attr_accessible :event_attributes, :address_1, :address_2, :capacity # ...
    

    【讨论】:

    • 感谢您的回复...虽然仍然遇到一些问题..我将其更改为下面但我仍然看到同样的问题。 // class Venue
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多