如何使用嵌套形式的gem'Paperclip'

时间:2012-07-19 13:20:37

标签: ruby-on-rails ruby-on-rails-3 associations paperclip nested-forms

在Devise的编辑页面中,我使用回形针放置图像上传器 如果我尝试将image_tag放在这里,它会像这样给出错误。

NoMethodError in Registrations#edit 
undefined method `photo' for #<ActionView::Helpers::FormBuilder:0x000000210752d0>

我有'用户'模型,由Devise使用。
用户有一个'UserProfile'模型 在'UserProfile'中,我添加了:照片到attr_accessible。 我还将其添加到'UserProfile'模型以便使用paperclip

  has_attached_file :photo,
    :styles => {
    :thumb=> "100x100>",
    :small  => "400x400>" } 

我的编辑视图是

<% resource.build_user_profile if resource.user_profile.nil? %>
<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name), :html => { :method => :put }) do |f| %>
  <%= devise_error_messages! %>

    <%= f.fields_for :user_profile do |profile_form| %>

      <div><%= profile_form.label :nickname %><br /> 
      <%= profile_form.text_field :nickname %></div> 

      <div><%= profile_form.label :photo %><br /> 
      <%= profile_form.file_field :photo %></div>

     <% if profile_form.photo.exists? then %>
      <%= image_tag profile_form.photo.url %>
      <%= image_tag profile_form.photo.url(:thumb) %>
      <%= image_tag profile_form.photo.url(:small) %>
     <% end %>
   <% end %> 

...continue on

2 个答案:

答案 0 :(得分:0)

尝试将新构建的user_profile分配给变量:

<% user_profile = resource.build_user_profile if resource.user_profile.nil? %>

然后将该变量传递给fields_for,如下所示:

<%= f.fields_for user_profile do |profile_form| %>

<%= f.fields_for :user_profile, user_profile do |profile_form| %>

我认为应该有用吗?

答案 1 :(得分:0)

要制作嵌套表单,请在父模型(用户)中添加此

accepts_nested_attributes_for :photos

这允许您一次性传递与照片模型和用户相关的参数。 Rails创建一个特殊的哈希键,用于存储名称为

的照片模型的值
photos_attributes

现在,当你执行@user = User.new params [:user]时,它还会构建@ user.photos

此外,在您的用户控制器新方法中,添加: @ user.photo.build

请参阅ryan bates的这个精彩的railscast以获得完整的解释: http://railscasts.com/episodes/134-paperclip

这也可能有用: http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html