Rails:路由到自定义控制器操作

时间:2012-06-17 13:06:19

标签: ruby-on-rails controller routes

我很难理解路线,我希望有人可以帮助我。

这是我的自定义控制器

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

我有文件设置/ 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”而不是路径放在一个其他资源页面上就会搞砸,因为资源名称是在设置/编辑之前放置的

THX

3 个答案:

答案 0 :(得分:18)

以下应该做:

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的方法。

答案 1 :(得分:4)

如果要明确定义路线,可以使用

之类的东西
get 'settings/edit' => 'settings#edit', :as => edit_settings

此语句定义当收到设置/编辑的GET请求时,调用SettingsController#edit方法,并且视图可以使用'edit_settings_path'引用此链接。

请花些时间阅读the Rails guide on routing。它解释了路由比其他任何参考更好。

还要记住rake routes任务,该任务列出了应用程序中定义的所有路由的详细信息。

答案 2 :(得分:0)

将路线改为

resources :settings

它可能会起作用。