【问题标题】:attribute values are changing while trying to insert into tables in rails尝试插入rails中的表时属性值正在发生变化
【发布时间】:2013-02-21 21:47:16
【问题描述】:

我正在从事一个有用户且用户有个人资料的项目。我正在使用设计 gem 进行用户身份验证。我更改了控制器中某个操作的路径,这导致了无法解释的行为。

Test::Application.routes.draw do
  match '/:username' => 'profile#show' , :as => :username


  get "profile/update"

  get "static_pages/index"

  devise_for :users 

服务器日志显示如下。

Started POST "/users" for 127.0.0.1 at 2013-02-22 03:07:48 +0530
Processing by ProfileController#show as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"Tr90BvI6sztk7gxlPm6KF3td3xIe91SpCZDGsIniv60=", "user"=>{"username"=>"example", "email"=>"example@email.com", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}, "commit"=>"Sign up", "username"=>"users"}
  Rendered profile/show.html.erb within layouts/application (0.1ms)
Completed 200 OK in 12ms (Views: 11.5ms | ActiveRecord: 0.0ms)

数据没有被插入数据库并且用户名参数正在改变,当我将路由更改为默认路由时,即

match '/:username' => 'profile#show' , :as => :username

改为

get "profile/show"

一切恢复正常。正在插入数据,一切正常。我不明白为什么在用户注册时调用配置文件控制器的操作。rake routes 给出以下输出

                username        /:username(.:format)           profile#show
          profile_update GET    /profile/update(.:format)      profile#update
      static_pages_index GET    /static_pages/index(.:format)  static_pages#index
        new_user_session GET    /users/sign_in(.:format)       devise/sessions#new
            user_session POST   /users/sign_in(.:format)       devise/sessions#create
    destroy_user_session DELETE /users/sign_out(.:format)      devise/sessions#destroy
           user_password POST   /users/password(.:format)      devise/passwords#create
       new_user_password GET    /users/password/new(.:format)  devise/passwords#new
      edit_user_password GET    /users/password/edit(.:format) devise/passwords#edit
                         PUT    /users/password(.:format)      devise/passwords#update
cancel_user_registration GET    /users/cancel(.:format)        devise/registrations#cancel
       user_registration POST   /users(.:format)               devise/registrations#create
   new_user_registration GET    /users/sign_up(.:format)       devise/registrations#new
  edit_user_registration GET    /users/edit(.:format)          devise/registrations#edit
                         PUT    /users(.:format)               devise/registrations#update
                         DELETE /users(.:format)               devise/registrations#destroy
                    root        /                              static_pages#inde

提前致谢。

【问题讨论】:

    标签: ruby-on-rails ruby routing controllers


    【解决方案1】:

    您的路线将按照定义的顺序进行匹配。由于/:username 是在您的路由文件顶部定义的并且具有较低的特异性,因此它似乎是在屏蔽之后定义的路由。我建议将该路径移至文件底部和/或应用一些约束,如正则表达式,以使其不那么“贪婪”。

    【讨论】:

    • 解决了这个问题。谢谢。但是为什么会调用与指定控制器不同的控制器和不同的操作,以及当路由甚至不与其他路由产生冲突时,路由优先级如何发挥作用?
    • 好吧,/:username 确实会与您对/users 的 POST 产生冲突,因为该路径将匹配 /:username 的默认约束。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-15
    • 1970-01-01
    • 2016-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多