Rails 3嵌套资源:无法使表单或页面起作用

时间:2011-12-05 18:17:52

标签: ruby-on-rails ruby ruby-on-rails-3

我目前正在为社交网站开发一个网络应用程序,但好像让我的嵌套资源正常工作是不可能的。如果你可以帮助我那将是伟大的,我会非常感激。

这是我的路线。我想有像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

3 个答案:

答案 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。祝你好运。