добавление поля обработки формы в rails 3.0 с помощью mongomapper - PullRequest
1 голос
/ 30 декабря 2010

У меня есть проект Rails 3.0, использующий монго с MongoMapper. У меня есть модель с базовой информацией, описывающей зоомагазин, в котором есть: Питомец - это отдельная модель.

У меня есть форма, которая позволяет мне создавать новые зоомагазины, но как мне добавить поле для создания питомца одновременно с созданием нового магазина? Прямо сейчас у меня есть взломанное решение, которое выполняет то, что я хочу, но я, вероятно, есть Rails Way, чтобы сделать это, а? Как я могу сделать это правильно, чтобы я мог использовать проверки в полях формы и тому подобное?

Мое текущее решение состоит в том, чтобы вручную взломать поле формы для домашнего животного (в шаблон формы добавлен тег с именем = "petstore [pet]"). Эта форма обрабатывается методом create petstore_controller, и я добавил код для создания домашнее животное из поля формы

Модель:

class Petstore
  include MongoMapper::Document

  many :pets, :dependent => :destroy

  key :name, String
  key :address, String
end

class Pet
  include MongoMapper::Document

  belongs_to :petstore

  key :petstore_id, ObjectID, :required=>true
  key :type, String, :required=>true
  key :name, String 
end

_form.html.erb

<%=form_for @petstore do |f| %>
  <li>
    <%= f.label :name %>
    <%= f.text_field :name, :placeholder =>"The name" %>
  </li>
  <li>
    <%= f.label :address %>
    <%= f.text_field :address, :placeholder =>'The address' %>
  </li>
  <li>
    <label for="petstore_pet">Type of pet</label>
    <input type="text" id="petstore_pet" name="petstore[pet]"> 
  <li>
    <%= f.submit "Submit" %>
  </li> 
<% end %>

petstores_controller.rb

def create
  pet = @petstore.pets.build :type => params[:petstore][:pet]
  pet.save if pet

  respond_to do |format| 
    ...
  end
end

Похожие темы / вопросы:

(Я не совсем уверен, как отобразить это решение на мой вопрос.)

(Принятый ответ ссылается на ветку группы Google, которая находится у меня над головой ...)

1 Ответ

1 голос
/ 03 марта 2011

Краткий ответ, нет простого и понятного способа сделать это.

чуть более длинный ответ:

Ваш контроллер попытается создать / обновить модель, передав ей хэш, полученный из формы. Ключом к успешному вложению форм является то, что сначала ваша форма возвращает вам правильные данные. Я думаю, что вы поняли эту часть. Во-вторых, вам нужно получить PetStore.create, чтобы сделать «правильные вещи» с этим хешем.

В MongoMapper правила работы с хешем очень просты. Он создает и экземпляр вашей модели, а затем вызывает #{key}= value для каждой пары ключ / значение в хэше. Например, если MyModel является классом документа MongoMapper и я вызываю MyModel.create(:foo=>"bar",:baz=>5) MongoMapper создает в экземпляре MyModel и вызывает foo="bar" и baz=5 для него. Пока эти методы существуют, MongoMapper не заботится о том, что они делают. (Обратите внимание, что метод класса key создает эти методы для каждого ключа.)

Чтобы все это заработало, вам нужно создать метод pet= в PetStore и заставить его построить модель питомца.

Это не идеальный ответ, но этого должно быть достаточно для того, чтобы заставить вас что-то работать.

...