Вложенная форма: find_or_create_by несколько полей - PullRequest
0 голосов
/ 11 февраля 2012

Я застрял в середине вложенной формы и использования метода активных записей "find_or_create_by" .. Что я пытаюсь сделать:

У меня есть 3 модели: аккаунт, транзакция и категория.

class Account < ActiveRecord::Base
  has_many :transactions, :dependent => :destroy
  has_many :categories, :dependent => :destroy
end

class Category < ActiveRecord::Base
  has_many :transactions
  belongs_to :account
end

class Transaction < ActiveRecord::Base    
  belongs_to :category, :autosave => true
  belongs_to :account

  accepts_nested_attributes_for :category
end

Моя форма выглядит так: app / views / Transactions / new.haml

= semantic_form_for @transaction do |f|
  = f.inputs do
    = f.input :account_id, :as => :hidden
    = f.input :title, :label => false
    = f.input :amount, :label => false
    = f.inputs :for => :category do |c|
      = c.input :title, :as => :string
      = c.input :account_id, :as => :hidden
  = f.buttons do
    = f.submit "Save"

Мои контроллеры выглядят так:

class TransactionsController < ApplicationController

  def new
    @transaction = Transaction.new
    @transaction.date ||= Transaction.last.date if Transaction.last
    @transaction.account= Account.find(params[:account]) if params[:account]
    @account = @last_transaction.account if @last_transaction
    @account = Account.find(params[:account]) if params[:account]
    @transaction.build_category(:account => @account)
  end

  def create
    @transaction = Transaction.new(params[:transaction])
    @account = @transaction.account
    respond_to do |format|
      if @transaction.save
         format.html {redirect_to (new_transaction_path( :account => @account ))}
      else
         format.html {redirect_to (new_transaction_path( :account => @account ))}
      end
    end
  end
end

Категории контроллера:

class CategoriesController < ApplicationController

  before_filter :authenticate_user!

  def new
    @category = Category.new
    @category.account = Account.find(params[:account]) if params[:account]
    @accounts = current_user.accounts
  end

  def create
    @category = Category.new(params[:category])
    respond_to do |format|
      if @category.save
        format.html {redirect_to (categories_path)}
      else
        format.html {render :action => "new"}
      end
    end
  end

  def update
    @category = Category.find(params[:id])
    respond_to do |format|
      if @category.update_attributes(params[:category])
        format.html {redirect_to (categories_path)}
      else
        format.html {render :action => "edit"}
      end
    end
  end
end

Теперь я застрял. Я хочу создать новую категорию, только если еще не существует категории с таким же названием и идентичным идентификатором account_id.

К настоящему времени он всегда создает новую категорию, игнорируя, что уже существует категория с таким же именем и идентичным account_id. Я знаю, что я должен использовать что-то вроде этого:

Category.find_or_create_by_title_and_account_id(category.title, account.id)

Но где я должен его использовать и как он должен выглядеть точно?

Я очень ценю вашу помощь!

1 Ответ

0 голосов
/ 11 февраля 2012

Вы можете использовать Category.find_or_initialize_by_title_and_account_id(category.title, account.id), затем изменить его и сохранить (_create_ сохраняет объект в той же строке). Но если я правильно понимаю, вам нужны проверки . По соглашению, мы разрабатываем наши приложения для получения ошибок (например: «Заголовок категории должен быть уникальным») при #create действиях ваших контроллеров, и если есть ошибки, мы снова render :action => :new (с той же формой, что и ранее, но ошибки показаны). Я вижу, что вы используете formtastic, поэтому у вас по умолчанию отображаются ошибки в формах (я думаю).

...