我目前正在为社交网站开发一个网络应用程序,但好像让我的嵌套资源正常工作是不可能的。如果你可以帮助我那将是伟大的,我会非常感激。
这是我的路线。我想有像mysite.com/username/photos /(new,edit等)的url结构。 url结构是这样的,但是在尝试访问表单或页面时出错。在下面我发布了迄今为止的内容。
的routes.rb
resources :users do
resources :photos
end
photo.rb
belongs_to :users
user.rb
has_many :photos, :foreign_key => "id", :dependent => :destroy
_form.html.erb 此表单使用回形针附件。我删除了一个<%before语句,因为它不会在这里显示下面的整个代码。
form_for(@photos,@user) :html => {:multipart => true} do |f| %>
photos_controller.rb
def new
@photo = Photo.new(params[:photo])
end
答案 0 :(得分:1)
不确定这是否是问题,但您的form_for
标记似乎格式错误。在指定用户后,您正在关闭form_for
标记上的括号,因此忽略了:html
部分。我会试试这个:
<%= form_for([@photos, @user], :html => {:multipart => true}) do |f| %>
@photos
和@user
必须作为数组传入。
另外,不确定为什么@photos
param会是复数。不应该是[@photo, @user]
吗?我可能在那方面错了。
答案 1 :(得分:1)
您需要创建一个before_filter来获取用户,并创建表单帖子来创建,而不是新建。您的照片控制器应如下所示:
before_filter :get_user
...
def new
@photo = @user.photos.build
end
def create
@photo = @user.photos.build(params[:photo])
respond_to do |format|
if @photo.save
format.html {redirect_to [@user, @photo], notice: "Photo saved!"}
else
format.html {render action: "new"}
end
end
end
...
private
def get_user
@user = User.find(params[:user_id])
end
这里,before_filter抓住用户。在嵌套路由中,父资源ID将位于params[:parent_id]
或本例中为params[:user_id]
。然后在创建控制器中,您想要从@user.photos
集合中构建照片。这将自动在照片和用户之间创建参考。
此外,您的form_for具有向后关系。它应该是form_for([@user, @photo]) ...
,而不是相反。
答案 2 :(得分:0)
你得到的错误是什么?在哪里?
有几件事:
在photo.rb
:
belongs_to :user
而不是users
您是否尝试从users#new
页面创建照片?如果是这样,请尝试查看accepts_nested_attributes_for
用法:
在user.rb
has_many :photos, :dependent => :destroy
accepts_nested_attributes_for :photo
然后,在users#new
表单上:
<%= form_for @user, :html => {:multipart => true} do |f| %>
# ... user attributes ...
<%= f.fields_for :photo do |p| %>
<%= p.file_field :name %>
<% end %>
<% end%>
另外,请考虑使用carrierwave代替回形针进行上传。这是railcast。祝你好运。