Спасибо, полное программное обеспечение! Очень полезный ресурс. Я уверен, что ваш пост поможет многим новичкам, таким как я.

а почти неделя с тех пор, как я начал копать глубже в формах, ассоциациях, хэшах, символах ... Но, похоже, я не могу решить головоломку без вашей помощи.

Я работаю над проектом для отображения контента различных галерей. Основная идея заключается в том, когда пользователь видит названия галерей (названия являются ссылками), чтобы можно было нажать на выбранную. Затем отображаются все изображения, принадлежащие этой галерее. Внизу должна быть ссылка «Добавить изображение в эту галерею».

Мои модели:

 class Gallery < ActiveRecord::Base
attr_accessible  :name
has_many :pictures 
 end


class Picture < ActiveRecord::Base 
attr_accessible  :image 
belongs_to :gallery
 end

Я создал индекс для gallery_id для таблицы 'pictures'.

Здесь возникает моя большая проблема, как передать gallery_id в действие контроллера «new». Как я видел в «Гибкой веб-разработке с Rails», это может быть:
<% = link_to 'Добавить картинку сюда ...', new_picture_path (: gallery_id => @ gallery.id)%>

Как кажется в этом случае foreign_key: gallery_id выставляется в адресной строке браузера. Вторая проблема состоит в том, что: gallery_id доступен для функции «new» контроллера, но «исчезает» для функции «create» (вызывая ошибку «Не удалось найти Gallery без идентификатора»). Проблема исчезла, когда я добавил скрытое поле в _form для изображений, в моем случае:

<%= form_for(@picture)   do |f| %>
<div class="field"> 
      <%= f.hidden_field :gallery_id , :value=>params[:gallery_id] %>
<%= f.label :image %><br />
<%= f.file_field :image %>
</div>

<div class="actions">
<%= f.submit "Create" %>
</div>
<% end %>

Вот мои определения в контроллере 'pictures':

def new
@gallery=Gallery.find(params[:gallery_id])
@picture=@gallery.pictures.build 
 end


def create
   @gallery = Gallery.find(params[:gallery_id])  
   @picture = @gallery.pictures.new(params[:picture])
  if @picture.save
     redirect_to(@picture, :notice => 'Picture was successfully created.')
  else    
     redirect_to(galleries ,:notice => 'Picture was NOT created.')
  end

 end

И наконец определение link_to в show.html.erb для галерей:

<% for picture in selpics(@gallery) %>
 <div id= "thumb" > 
 <%= image_tag picture.image %>
 </div>
<% end %>

 <%= link_to 'Add a picture here...',new_picture_path(:gallery_id=>@gallery.id) %>

Вот выходные данные отладки перед отправкой изображения: ---! Map: ActiveSupport :: HashWithIndifferentAccess gallery_id: действие "6": новый контроллер: изображения

и после отправки кнопки «создать» (за исключением поднятого):

{"utf8"=>"✓",
 "authenticity_token"=>"IGI4MfDgbavBShO7R2PXIiK8fGjkgHDPbI117tcfxmc=",
 "picture"=>{"image"=>"wilsonblx.png"},
 "commit"=>"Create"}

Как видите, в хэше «pictures» нет ничего похожего на «gallery_id».

Обобщая мои вопросы к вам:

Есть ли способ передать Foreign_key без скрытого поля?

Мог ли я как-то скрыть прохождение формы внешнего ключа, отображаемой в строке URL?

Есть ли альтернатива для передачи аргументов с использованием 'link_to'?

Спасибо .