Спасибо, полное программное обеспечение! Очень полезный ресурс. Я уверен, что ваш пост поможет многим новичкам, таким как я.
а почти неделя с тех пор, как я начал копать глубже в формах, ассоциациях, хэшах, символах ... Но, похоже, я не могу решить головоломку без вашей помощи.
Я работаю над проектом для отображения контента различных галерей. Основная идея заключается в том, когда пользователь видит названия галерей (названия являются ссылками), чтобы можно было нажать на выбранную. Затем отображаются все изображения, принадлежащие этой галерее. Внизу должна быть ссылка «Добавить изображение в эту галерею».
Мои модели:
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])
@[email protected]
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'?
Спасибо .