我有一个带有设计的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的新手,我试图解决这个问题几个小时......我怎样才能创建一个页面来更新图像和描述?感谢
答案 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)
在一个控制器中应该有一个具有相同名称的方法,您有两种编辑方法。将一种编辑方法更改为更新方法(参考: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
你有错误的http动词(帖子),你需要PUT/PATCH
而不是POST
devise_scope :user do
get "edit" => "pages#edit"
put "update" => "pages#update"
end
在您的视图上看起来像(示例而未经过测试)
<%= 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" %>