Rails 3 Вложенные переменные ресурса

У меня есть несколько вопросов, касающихся объекта Transaction, который я создаю.

Транзакция принадлежит ссуде, а ссуда имеет_много транзакций.

Поэтому я настраиваю вложенный маршрут:

resources :loans do
  resources :transactions
end

У меня вопрос: как передать значение кредита в поле «loan_id» транзакции? Лучше всего это сделать в контроллере или как hidden_field в форме? Создает ли вложенный маршрут простой способ получить эту переменную?

Я предполагал, что это будет сделано автоматически, но поле было пустым, когда я сохранил его как есть.

Любая помощь будет принята с благодарностью!


person Justin    schedule 18.05.2011    source источник


Ответы (2)


если вы вызываете конкретную транзакцию, маршрут для транзакции new будет

loans/:loan_id/transactions/new

вы можете использовать ассоциацию модели следующим образом: в вашем действии create:

@transaction = Loan.find(params[:loan_id]).transactions.build

таким образом, ваш новый @transaction уже будет заполнен идентификатором кредита.

person Andrei S    schedule 18.05.2011
comment
Я только что попробовал это и получил следующее сообщение: Не удалось найти кредит без идентификатора. Почему :loan_id не распознается? - person Justin; 19.05.2011
comment
убедитесь, что у вас есть кредит в базе данных с :loan_id, который вы пытаетесь вызвать. вызов find on Loan вызовет исключение, если ссуда с id = credit_id не существует - это должно произойти, только если вы введете URL-адрес вручную - person Andrei S; 19.05.2011
comment
Заем существует, и я связываюсь с ним с помощью ‹%= link_to 'Одолжить сейчас', new_loan_transaction_path(@loan), :class =› 'lend_button' %› Это правильно? Все равно почему-то выдает ошибку. Спасибо за дополнительную помощь! - person Justin; 19.05.2011
comment
ссылка правильная (действие new, для транзакции в @loan). когда вылетает ошибка? в акции new или create? что печатает, если вы puts params[:loan_id]? это id названного кредита? - person Andrei S; 19.05.2011
comment
Ошибка возникает сразу после отправки новой формы транзакции и называется ActiveRecord::RecordNotFound в TransactionsController#create. Итак, это в методе создания. В params[:loan_id] ничего нет. По какой-то причине я не думаю, что они связаны. Есть ли что-то, что мне нужно добавить к маршрутам помимо того, что у меня есть выше? Еще раз спасибо, я очень ценю помощь! - person Justin; 19.05.2011
comment
я попытался воспроизвести ваши модели, отношения и контроллеры, и для целей тестирования все, что у меня есть в create, это @transaction = Loan.find(params[:loan_id]).transactions.build(params[:transaction]), после чего я вызываю save. и это работает. дает ли запуск rake routes такой маршрут, как new_loan_transaction GET /loans/:loan_id/transactions/new(.:format) {:action=>"new", :controller=>"transactions"} ? если ответ да, то у меня заканчиваются идеи :) - person Andrei S; 19.05.2011
comment
Спасибо, мой друг! Теперь это работает! Я не уверен, что именно заставило его работать, потому что я внес сразу несколько изменений, но это работает! Я очень ценю всю помощь!!! - person Justin; 19.05.2011

Подумайте о том, чтобы добавить before_filter к вашему контроллеру и заставить его вызывать закрытый метод для получения :id во всех действиях. Поместите это в верхнюю часть вашего контроллера transactions:

before_filter :load_loan

А потом после всех действий добавить:

private
def load_loan
  @loan.find(params[:loan_id])
end

Используйте это так в своем действии new:

@transaction = @loan.transactions.build
person Paul Simpson    schedule 20.10.2011