在Rails中的new / create操作上设置外键

时间:2011-12-08 22:52:05

标签: ruby-on-rails activerecord

好吧所以我对这个铁轨的东西很新,所以请耐心等待......

我正在尝试制作最简单的应用程序,圣诞节清单,我需要一些帮助。让我来填写你:

我为一个人和一个项目搭建了脚手架。我稍微修改了一下模型,这就是它们的样子。

class Person < ActiveRecord::Base
  has_many :item, :dependent => :destroy
end

class Item < ActiveRecord::Base
  belongs_to :person
end

class CreateItems < ActiveRecord::Migration
  def change
    create_table :items do |t|
      t.integer :person_id
      t.string :description

      t.timestamps
    end
  end
end

class CreatePeople < ActiveRecord::Migration
  def change
    create_table :people do |t|
      t.string :name

      t.timestamps
    end
  end
end

似乎很酷。 people_controller上的索引操作列出了所有人(duh)

<% @people.each do |person| %>
  <tr>
    <td><%= link_to person.name, "/people/#{person.id}" %></td>
  </tr>
<% end %>

当你点击一个时,它会调用show action(同一个控制器)来获取该人的所有项目

def show
  @person = Person.find(params[:id])
  @items = Item.where(:person_id => params[:id])

  respond_to do |format|
    format.html # show.html.erb
    format.json { render json: @person }
  end
end

并拉出节目视图

<table>
<% @items.each do |item| %>
  <tr>
    <td><%= item.description %></td>
    <td><%= link_to 'Edit', edit_item_path %></td>
    <td><%= link_to 'Remove', "" %></td>
  </tr>
<% end %>
</table>
<br/>
<%= link_to 'Add', :controller => :items, :action => :new, :id => @person.id %>

底部的链接是为我们正在查看的摘要的人添加新项目。那么在我有的items_controller的新动作中:

def new
  @item = Item.new
  @item.person_id = params[:id]

  respond_to do |format|
    format.html # new.html.erb
    format.json { render json: @item }
  end
end

现在我知道在调用@ item.save之前不会保存。我想这是从_form.html.erb提交按钮发生的,该按钮又调用控制器中的创建动作?

def create
  @item = Item.new(params[:item])

  respond_to do |format|
    if @item.save
      format.html { redirect_to @item, notice: 'Item was successfully created.' }
      format.json { render json: @item, status: :created, location: @item }
    else
      format.html { render action: "new" }
      format.json { render json: @item.errors, status: :unprocessable_entity }
    end
  end
end

我只是有点困惑,为什么它永远不会被设置,似乎应该这么容易(我确定它是哈哈)。另外,当我在这里时,您可能已经注意到我上面的“删除”链接没有链接。这是因为我也无法弄清楚如何从该链接中删除操作以删除正确的项目。

就像我说的,这对我来说都是新的。我感谢任何帮助!请随意批评我在这里所做的一切。我没有感情:))

1 个答案:

答案 0 :(得分:1)

正如Vibhu所说,你的问题很可能源于你has_many :items控制器中应该Person(注意复数)。

要在表单中添加指定此人ID的隐藏字段,请在您的创建表单中添加:

f.hidden_field :person_id