Установить внешний ключ на действие new / create в Rails - PullRequest
2 голосов
/ 09 декабря 2011

Хорошо, я довольно новичок в этом рельсовом материале, поэтому, пожалуйста, потерпите меня ...

Я пытаюсь сделать самое простое приложение из всех, рождественский список, и мне нужно немного помочь. Позвольте мне заполнить вас:

Я строил человека и предмет. Я немного изменил свои модели, и вот как они выглядят.

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

Похоже, это все круто. Действие index для people_controller перечисляет всех людей (duh)

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

и когда вы нажимаете на него, он вызывает действие show (тот же контроллер), который получает все элементы для этого человека

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, которая, в свою очередь, вызывает действие create в контроллере?

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 Ответ

1 голос
/ 09 декабря 2011

Как сказал Вибху, вполне вероятно, что ваша проблема проистекает из того факта, что вы должны иметь has_many :items (обратите внимание на множественное число) в вашем Person контроллере.

Чтобы добавить в форму скрытый файл с указанием идентификатора человека, добавьте его в форму создания:

f.hidden_field :person_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...