我可以避免重写Devise Controller吗?

时间:2012-08-14 20:24:42

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

我有一个标准设计编辑用户表单:

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

  <div><%= f.label :email %><br />
  <%= f.email_field :email %></div>

  <div><%= f.label :password %> <i>(leave blank if you don't want to change it)</i><br />
  <%= f.password_field :password, :autocomplete => "off" %></div>

  <div><%= f.label :password_confirmation %><br />
  <%= f.password_field :password_confirmation %></div>

  <p>Current Photo</p>
  <%= image_tag @user.photo.url %>

   <%= f.file_field :photo %>

  <div><%= f.label :current_password %> <i>(we need your current password to confirm your changes)</i><br />
  <%= f.password_field :current_password %></div>

  <div><%= f.submit "Update" %></div>
<% end %>

现在,Rails显然因为行<%= image_tag @user.photo.url %>而抱怨,因为在设计控制器的编辑操作中没有@user。通常,我可以将@user = current_user放在控制器中并完成。

目标是在用户上传新照片之前向用户显示他们当前的照片。最好的方法是什么?

1 个答案:

答案 0 :(得分:3)

如果用户是唯一使用设计的资源,则可以使用resource.photo.url

如果有一些不同的类会使用设计进行身份验证,但没有照片,则可以使用resource.respond_to?(:photo)包含照片和照片字段,如下所示:

<% if resource.respond_to?(:photo) %>
  <p>Current Photo</p>
  <%= image_tag resource.photo.url %>

  <%= f.file_field :photo %>
<% end %>

这样,您只在课程具有照片属性时才包含照片信息