1

我目前有一个带有典型用户模型的 Ruby on Rails 应用程序。我想允许用户编辑他们自己的帐户信息,并更改他们的电子邮件或密码。但是,我想在两个不同的页面上有相应的表格。

users_controller.rb一个show, new, create, 和edit路径。问题是使用用户数据库的edit路径update将要求所有表单位于同一页面上,这对于只想更新其电子邮件或密码而不是两者的用户来说是不方便的。本质上,我需要该edit路径在多个页面上可用。

有什么建议么?

4

2 回答 2

2

不可能。每个命名路由只有一个操作。

您可以使用一个命名路由加上一个额外的参数来告诉控制器要呈现哪个表单(或表单的一部分):

named route                                  path
edit_user_path(@user, :form => "info")       mysite.com/users/1/edit?form=info
edit_user_path(@user, :form => "acct")       mysite.com/users/1/edit?form=acct
edit_user_path(@user)                        mysite.com/users/1/edit

然后读取这个参数并根据值在模板之间切换。没有参数将呈现包含完整表单的默认视图:

def edit
  # ...
  case params[:form]
  when "info"
    render :template => "info_only"
  when "acct"
    render :template => "name_and_password"
  else
    render :action => :edit
  end
end

我认为这只是为了用户体验而不是为了安全。所有这些单独的表单都将 PUT 到相同的更新操作,这意味着以一种形式访问的所有属性(例如密码)都可以在另一种形式中访问。

于 2013-06-06T03:13:31.220 回答
1

将表单拆分为单独的.html.erb文件(如email.html.erbpassword.html.erb)并在您的控制器中编写如下内容:

def edit
  ...
  if params[:email]
    render 'email'
  end
  if params[:password]
    render 'password'
  end
end

显然,条件可以是任何你想要的。

于 2013-06-06T03:09:37.397 回答