Вы спрашиваете об отладке, поэтому первым шагом может быть просмотр журнала сервера (log / development.log).
Там вы должны увидеть хэш "params".Может быть, ваши параметры содержат «активность» => {«client_id» => ..} вместо «client_id» => ..?
Также посмотрите на сгенерированную страницу HTML - используйте Firebug или просто используйте "Просмотр источника "метод вашего браузера.Особенно обращайте внимание на входные имена.
Если все выглядит хорошо, добавьте несколько отладочных вызовов в ваше действие и посмотрите на файл development.log для некоторых действий с базой данных - выглядят ли запросы SQL так, как они делаютВы хотите?
В вашем вопросе нет метода «сохранить».Метод build не сохраняет созданную запись.Может быть, это ваша проблема?
def add_client
logger.debug "Creating Activity"
@activity = IndividualActivity.new(session[:individual_activity])
logger.debug "Building clientship"
# Refresh client
@activity.clientships.build(:client => Client.find(params[:client_id]))
logger.debug "@activity = #{@activity.inspect}"
# Maybe you were missing this part of code?
logger.debug "Saving @activity"
@activity.save! # use a ! to easily see any problems with saving.
# Remove in production and add a proper if
logger.debug "Saved. @activity = #{@activity.inspect}"
respond_to do |format|
format.js
end
end
Вы должны создать функциональный тест (если вы этого еще не сделали) и убедиться, что если вы отправляете правильные параметры, ваше действие работает как задумано.
Тест сузит ваш поиск.Если тест не пройден, вы знаете, что у вас есть проблема в действии.Если тест в порядке, вам необходимо убедиться, что параметры отправлены правильно, и у вас, вероятно, есть проблема с вашей точки зрения.
ОБНОВЛЕНИЕ : вы сказали, что у вас есть ДВЕ формы на странице.Это может быть проблемой, поскольку одновременно может быть отправлена только одна форма.В противном случае он должен был бы работать так, чтобы можно было отправлять два запроса в одном запросе.
Первое (полезно для всех подобных проблем): проверить, имеет ли ваша страница правильную структуру HTML - дляПример http://validator.w3.org будет хорошим началом.Попробуйте сделать код валидным.Я знаю, что некоторые люди воспринимают «зеленый» статус как недостижимое мастерство, но на самом деле это не так сложно.Используя действительный код, вы можете быть уверены, что браузер действительно понимает, что вы имеете в виду.
Второе: поместите все свои данные в одной форме.У вас проблемы с вложенными атрибутами.Для начала попробуйте вручную вставить входные данные с именем, например <input name="activity[clientship_attributes][0][name]" value="John"/>
, и для существующих клиентов убедитесь, что есть входные данные с именем = activity[clientship_attributes][0][id]
.Именно так обрабатываются вложенные атрибуты.
Ваше представление может создавать такие поля автоматически.Эта конструкция должна быть тем, что вам нужно: (она работала в одном из моих старых проектов в rails 2.x, я просто заменила имена на те, которые вы используете)
<% form_for(@activity) do |f| %>
<p><%= f.text_field :activity_something %></p>
<% @activity.clientships.each do |clientship| %>
<% f.fields_for :clientships, clientship do |cform| %>
<p><%= cform.text_field :name %></p>
<p><%= cform.text_fiels :something %></p>
<% end %>
<% end %>
<% end %>
Если вы действительно хотите использоватьчастичное там, не создавайте новую форму в частичном.Используйте только части кода, приведенного выше.
Чтобы передать переменную в частичное, используйте атрибут: locals в том месте, где вы вызываете render: частичное:
<%= render :partial => 'clientship', :locals => {:form => f} %>
Затем в вашем частичном, вы можете использовать локальную переменную form
, где вы будете использовать f
вне партиала.Вы можете, конечно, сопоставить переменные с тем же именем: :locals => {:f => f}