61883


[Railsとdeviseでユーザーの新規登録のみできないようにする](https://qiita.com/iguchi1124/items/bb25cf650348f31ea37e)

こちらにどんぴしゃの記事があったので真似して  
user.rb から registable を削除  
route.rb に

[code]

    as :user do
        get 'users/edit' => 'devise/registrations#edit', :as => 'edit_user_registration'
        put 'users' => 'devise/registrations#update', :as => 'user_registration'
      end
    
[/code]

というのを追加したところ registable を消す前は１度は正常表示できた edit 画面で

[code]

    NoMethodError in Devise::Registrations#edit
    
    Showing /home/chico/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/devise-i18n-views-0.3.7/app/views/devise/registrations/edit.html.erb where line #3 raised:
    
    undefined method `registration_path' for #<#<Class:0x000055dcd4a26938>:0x000055dcd4a300c8>
    
[/code]

というエラーになってしまいます

rails routes をみると

[code]

    edit_user_registration GET    /users/edit(.:format)                                                                    devise/registrations#edit
    user_registration PUT    /users(.:format)                                                                         devise/registrations#update
    
[/code]

となってるので route.rb の追加した部分を

[code]

    put 'users' => 'devise/registrations#update', :as => 'registration'
    
[/code]

と as の後を user_ をつけないようにしてみたところ  
registration_path が定義されたために edit 画面は表示されたんですが  
パスワードやメアドを変更して変更ボタンを押すと

[code]

    Completed 406 Not Acceptable in 691ms (ActiveRecord: 15.7ms | Allocations: 4539)
    
    ActionController::UnknownFormat (ActionController::UnknownFormat):
    
    responders (3.0.0) lib/action_controller/respond_with.rb:215:in `respond_with'
    
[/code]

というよくわからないエラーになってしまいます

[code]

    {"authenticity_token"=>"...",
     "user"=>{"email"=>"admin@test", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]", "current_password"=>"[FILTERED]"},
     "commit"=>"更新",
     "format"=>"user"}
    
[/code]

パスワード変更時に飛んでるパラメーターはこんな感じで registable を消す前と同じです

どこが悪いのでしょうか…

* * *

追記です

registable があるときは registration_path で生成されるパスが

[code]

    action="/users" 
    
[/code]

なのに registable を消して  
`put 'users' => 'devise/registrations#update', :as => 'registration'`  
を追加したあとは

[code]

    action="/users.user" 
    
[/code]

となってしまっています

as の後 user_ を消すだけでは registable のときにあった regitration_path と同じにはならないんでしょうか…

registable と routes.rb を devise デフォルトに戻して rails routes をみてみると

[code]

    user_registration PATCH  /users(.:format)                                                                         devise/registrations#update
    PUT    /users(.:format)                                                                         devise/registrations#update
    
[/code]

となっていて registration_path というヘルパーメソッド？は生成されてないように見えますが、registration_path
というのがかかれた user/edit を開いてもエラーが起こりません

これは route.rb によって自動で生成されているメソッドではなく、registable
というインターフェース？で生成されるメソッドということなのでしょうか


CC BY-SA 4.0
2019-12-28T12:06:19.473
61854
2019-12-29T18:27:58.327
2019-12-28T12:38:57.480
question
ruby-on-rails devise
devise で新規登録だけを禁止したい

[code]

    def registration_path(resource_name)
        self.send("#{resource_name}_registration_path")
    end
    
[/code]

というヘルパーを無理やり作って registration_path で user_registration_path になるようにしたら動きました

`rails g devise:views users`  
でビューを生成して user_registration_path にかきかえてもいいんでしょうけど  
生成されるのが i18n 対応のビューじゃなくて自分で文言をおきかえないといけなくて面倒なのでヘルパーで対応しました


CC BY-SA 4.0
2019-12-29T18:27:58.327
61883
2019-12-29T18:27:58.327
61854
answer