ruby-on-rails - Rails 使用正确的 URL 渲染命名路由

标签 ruby-on-rails ruby ruby-on-rails-3

我的 Rails 应用程序中有以下路线

match '/settings', to: 'Users#edit', as: 'settings'

以及对应的 Controller 代码

def edit
  @user = current_user
end

def update
  correct_user
  @user = User.find(params[:id])
  if !@user.authenticate(params[:old_password])
    flash[:error] = 'Old password did not match'
    redirect_to settings_path
  elsif @user.update_attributes(params[:user])
    flash[:success] = "Settings updated"
    redirect_to settings_path
  else
    render 'edit'
  end
end

我的编辑页面现在只是一个密码更改页面,当我访问 /settings 时,我看到了我要排除的页面。当我 redirect_to settings_path 时,url 仍然是 /settings,这是我想要的行为。

在我的 edit 模板中,我有代码来处理对象错误并将它们呈现在页面上。当 render 'edit 时,如果出现对象错误,将触发此代码。但是,如果我重定向到该页面,则代码不存在。所以我需要调用 render 'edit' 来查看错误。

但是,调用 render 'edit' 会导致 URL 更改为 /users/:id/edit,这正是我不会 想要。我希望 URL 在调用 render 'edit' 后保留为 /settings。我怎样才能做到这一点?

注意:我已经搜索过 SO 和互联网的其他部分,但没有找到适合我需要的东西。有一个或两个 SO 主题具有类似的问题,但它们都使用闪烁和基于 hacky 重定向的解决方法,这不是我想要的。

最佳答案

你会想像这样设置你的路线:

match 'settings': 'users#edit', via: :get
match 'settings': 'users#update', via: :put

那么表单应该这样声明:

<%= form_for @user, url: settings_path %>

在你的 Controller 中,确保你像这样调用render:

render action: "edit"

关于ruby-on-rails - Rails 使用正确的 URL 渲染命名路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11477544/

相关文章:

javascript - 什么会导致 Rails 3.1 "= require jquery"停止工作?

javascript - Rails '.js.erb' 不呈现部分

ruby-on-rails - 在 Rails 应用程序中集成 Google 日历

Ruby 字符串操作不适用于捕获的组

ruby-on-rails - Rails 项目可以在不同的计算机上移植吗?

ruby-on-rails - 创建对象时是否需要foreign_key列?

ruby-on-rails - 在 mongoid 中查询包含哈希的数组字段

ruby - 在 rspec 中匹配参数的属性值

ruby - 使用 ffmpeg、ffprobe 或 rvideo 在 ruby​​ 脚本中获取视频元数据

mysql - 有效地从多个 rails 模型创建 "feed"?