Rails:路由到自定义控制器操作
Posted
技术标签:
【中文标题】Rails:路由到自定义控制器操作【英文标题】:Rails: Route to custom controller action 【发布时间】:2012-06-19 18:03:22 【问题描述】:我很难理解路线,希望有人能帮助我。
这是我的自定义控制器
class SettingsController < ApplicationController
before_filter :authenticate_user!
def edit
@user = current_user
end
def update
@user = User.find(current_user.id)
if @user.update_attributes(params[:user])
# Sign in the user bypassing validation in case his password changed
sign_in @user, :bypass => true
redirect_to root_path
else
render "edit"
end
end
end
我有文件 settings/edit.html.erb 和我的链接
<li><%= link_to('Settings', edit_settings_path) %></li>
路线
get "settings/edit"
对此不起作用,因为那样我得到了
undefined local variable or method `edit_settings_path' for #<#<Class:0x00000001814ad8>:0x00000002b40a80>
我必须给这个什么路线?我想不通。如果我放置“/settings/edit”而不是路径,一旦我在其他资源页面上,它就会混乱,因为资源名称放在设置/编辑之前
谢谢
【问题讨论】:
先告诉我们您尝试了哪些路线 【参考方案1】:以下应该做的:
get 'settings/edit' => 'settings#edit', :as => :edit_settings
# you can change put to post as you see fit
put 'settings/edit' => 'settings#update'
如果你直接在链接中使用/settings/edit
,你应该不会有其他资源名称被附加在路径中的问题。但是,如果没有前导斜杠,即settings/edit
,它可能会有这个问题。
edit_settings_path
不起作用的原因可能是因为您没有声明命名路由。您必须使用:as
选项来定义您将通过哪种方法生成此路径/url。
【讨论】:
非常感谢!我真的只是忘记了它前面的/。不过我最终还是使用了你的解决方案:)【参考方案2】:如果你想明确定义路由,你可以使用类似
get 'settings/edit' => 'settings#edit', :as => edit_settings
此语句定义当接收到设置/编辑的 GET 请求时,调用 SettingsController#edit 方法,并且视图可以使用 'edit_settings_path' 引用此链接。
花点时间阅读the Rails guide on routing。它比任何其他参考资料都更好地解释了路由。
还要记住rake routes
任务,它列出了您的应用程序中定义的所有路由的详细信息。
【讨论】:
以上是关于Rails:路由到自定义控制器操作的主要内容,如果未能解决你的问题,请参考以下文章