我有一个非常基本的'用户'模型,控制& Rails应用程序的视图。我正在尝试添加一个“配置文件”部分,用户可以在登录后更新其用户信息(并将其user_id存储为会话变量)。
我已经搭建了一个基本的'profile'模型,控制器和视图(_form,index和edit all using simple_form)。该模型为空,视图几乎是用户视图的副本,除了我已将“show”格式移动到配置文件索引视图。在我的控制器中,我几乎复制了用户控制器,删除了新的,创建,显示和销毁操作。
这就是我所拥有的:
class ProfileController < ApplicationController
def index
@profile = User.find(session[:user_id])
end
def edit
@profile = User.find(session[:user_id])
end
def update
@profile = User.find(session[:user_id])
respond_to do |format|
if @profile.update_attributes(params[:profile])
redirect_to @profile, notice: 'Profile was successfully updated.'
else
render action: "edit"
end
end
end
end
我尝试了这两种路线格式:
match "profile" => "profile#index"
match "profile/edit" => "profile#edit"
match "profile/update" => "profile#update"
和
controller :profile do
put 'profile/update' => :update
get 'profile' => :index
get 'profile/edit' => :edit
end
当我加载〜/ profile / edit /表格正确呈现并填充我的字段时。我使用的是simple_form,这是我的_form.html.erb文件的开头:
<%= simple_form_for @profile, :url => url_for(:action => 'update', :controller => 'profile'), :html => { :id => "edit_profile", :class => 'form-horizontal' }, :method => 'put' do |f| %>
但simple_form仍将for="user_***"
传递给所有字段输入。
我将@profile.update_attributes(params[:profile])
更新为@profile.update_attributes(params[:user])
,认为这是问题所在。当我单击“更新用户”(仍引用用户模型)时。表单重新加载到〜/ profile / update但没有任何反应。
我很确定我在这里错过了明显的路由/模型问题,但我似乎无法自己解决这个问题。
答案 0 :(得分:2)
我认为这不是路由/模型问题。您的修改个人资料页面仍然引用用户,因为您的@profile
是User
而不是Profile
。
首先,如果你想遵循我强烈推荐的Rails约定,请将控制器类的复数形式用作class ProfilesController < ApplicationController
。
然后,将您的个人资料资源的路由定义为resources :profiles, :only => [:index, :edit, :update]
您的个人资料#编辑为:
def edit
@profile = User.find(session[:user_id]).profile #(i.e. if user has_one profile)
# or @profile = Profile.find(params[:id) depending on what params are being passed here
end