Почему это:
# edit.html.erb
<%= form_for @product do |f| %>
<%= f.fields_for :shop do |sf| %>
# Nothing here
<% end %>
<% end %>
создает скрытое поле ввода:
<input type="hidden" value="23" name="product[shop_attributes][id]" id="product_shop_attributes_id">
?
Соответствующий код контроллера:
def edit
@product = Product.find(params[:id])
end