为属性创建form_for用户图像和描述

时间:2014-06-27 02:46:03

标签: ruby-on-rails devise

我有一个带有设计的rails应用程序,我向用户添加了一个配置文件图像和一个描述。我想要做的是创建一个页面(默认注册/编辑的不同),用户在登录后只能设置这两个属性(图像和描述)。

        <%= form_for(:user, html: { method: :put, :multipart => true })) do |f| %>
         <div class="form-group">
           <%= f.label :Profile_Image %>
           <%= f.file_field :image, class: "form-control" %>
         </div>
         <div class="form-group"> 
          <%= f.label :Descrição %>
            <%= f.text_area :description, class: "form-control", rows: "10" %>
         </div>
        <% end %>

我已经尝试了两种不同的控制器,但没有一种能够工作:

def edit
end

def edit
  @user = User.find(params[:id])
end

我的配置 - &gt;路线是:

get "edit" => "pages#edit"
post "edit" => "pages#edit"

但是当我点击提交时它什么也没做!我是rails的新手,我试图解决这个问题几个小时......我怎样才能创建一个页面来更新图像和描述?感谢

2 个答案:

答案 0 :(得分:1)

您需要在控制器中使用更新方法。您的编辑方法允许表单呈现,但您需要这样的内容:

def update
   current_user.update(user_params)
end

然后你的控制器中会有另一个名为user_params的方法,它看起来像这样。我被教导要把它放在私人标题下。

private
   def user_params
     params.require(:user).permit(:profile_image, :description)
   end

我相信有一种快捷方式可以将你的params包含在你的更新方法中,但是这样做。

答案 1 :(得分:1)

  1. 使用注册控制器设计,您应该自定义它。
  2. 在一个控制器中应该有一个具有相同名称的方法,您有两种编辑方法。将一种编辑方法更改为更新方法(参考:Allow users to edit their account

    <强> pages_controller.rb

    class PagesController < Devise::RegistrationsController
    
    def edit
     @user = current_user
    end
    
    def update
     @user = current_user
    
     successfully_updated = if needs_password?(@user, params)
       @user.update_with_password(devise_parameter_sanitizer.for(:account_update))
     else
       params[:user].delete(:current_password)
       @user.update_with_password(devise_parameter_sanitizer.for(:account_update))
     end
    
     if successfully_updated
      set_flash_message :notice, :updated
      # Sign in the user bypassing validation in case his password changed
      sign_in @user, :bypass => true
      redirect_to after_update_path_for(@user)
     else
      render "edit"
     end
    end
    
    private
    def needs_password?(user, params)
      user.email != params[:user][:email] || params[:user][:password].present?
    end
    end
    

    <强> application_controller.rb

    class ApplicationController < ActionController::Base
    protect_from_forgery with: :exception
    
    before_filter :configure_permitted_parameters, if: :devise_controller?
    
    def configure_permitted_parameters
      devise_parameter_sanitizer.for(:account_update) do |u|
        u.permit(:description, :image, :email, :password, :password_confirmation)
      end
    end
    end
    
  3. 你有错误的http动词(帖子),你需要PUT/PATCH而不是POST

    devise_scope :user do
     get "edit" => "pages#edit"
     put "update" => "pages#update"
    end
    
  4. 在您的视图上看起来像(示例而未经过测试)

    <%= form_for(@user, :url => update_pages_path, :html => { :method => :put }) do |f| %>
      <%= devise_error_messages! %>
      <div class="form-group">
        <%= f.label :image, "Profile Image" %>
        <%= f.file_field :image, class: "form-control" %>
      </div>
      <div class="form-group"> 
        <%= f.label description, "Descrição" %>
        <%= f.text_area :description, class: "form-control", rows: "10" %>
      </div>
     <% end %>
    <%= f.submit "Save Image" %>