Rails路由更新模型而不传递:id

时间:2012-03-21 06:58:50

标签: ruby-on-rails-3 rails-routing simple-form

我有一个非常基本的'用户'模型,控制& 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但没有任何反应。

我很确定我在这里错过了明显的路由/模型问题,但我似乎无法自己解决这个问题。

1 个答案:

答案 0 :(得分:2)

我认为这不是路由/模型问题。您的修改个人资料页面仍然引用用户,因为您的@profileUser而不是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