在 Rails 上将自定义表单添加到 Devise 编辑页面 Ruby
Adding custom form into Devise edit page Ruby on Rails
我在将自定义表单添加到 Devise edit
页面时遇到问题。目前,我有两个模型 User
和 UserAddress
。我将 edit
页面拆分为多个页面,这是我的路线:
devise_for :users, path: "user", path_names: {sing_in: "sign_in", sing_out: "sign_out", sing_up: "sign_up", edit: "edit"}, :controllers => { :registrations => :registrations }
devise_scope :user do
match 'user/edit' => 'registrations#edit', via: :get, :as => :user_basic
match 'user/edit/addresses' => 'registrations#addresses', via: :get, :as => :user_addresses
...
resources :user_addresses, only: [:create, :destroy]
end
resources :users, path: "user", only: [:show]
我创建了 User Addresses
控制器来处理 create
和 destroy
操作:
class UserAddressesController < ApplicationController
def create
@User = User.find(params[:user_id])
if params[:addresses]
params[:addresses].each do |address|
@User.address.create(address: address)
end
@addresses = @User.addresses
redirect_back(fallback_location: request.referer, notice: "Success")
end
end
def destoy
@address = Address.find(params[:id])
@User = @address.user
@address.destroy
@addresses = Address.where(user_id: @user.id)
respond_to :js
end
end
现在我想添加从 Devise edit
页面添加新地址的功能(我最近会使用 ajax
来更新表格下的记录),像这样(haml
):
= form_for user_addresses_path, url: user_addresses_path(current_user), method: 'post', :html => { class: "form", :multipart => true } do |f|
= f.text_field :name
= f.text_field :address
= f.submit
当我点击 submit
时,出现以下错误:
No route matches [POST] "/user/edit/addresses.1"
我认为我需要将 resources :user_addresses, only: [:create, :destroy]
移出 devise_scope
,但我不想更改 url
(www.url.com/user/edit/addresses).我究竟做错了什么?甚至可以将自定义表单添加到 Devise 中吗?非常感谢您的帮助和时间。
更新:
UserAddress
型号:
class UserAddress < ApplicationRecord
belongs_to :user, :foreign_key => 'user_id'
# Geocoder
geocoded_by :address
after_validation :geocode, :if => lambda{ |obj| obj.address_changed? }
end
这里你的路线 user/edit/address 是从比赛中生成的,是通过 get 方法编写的,所以你需要用
来改变它
match 'user/edit/addresses' => 'registrations#addresses', via: :post, :as => :user_addresses
并且在 url 路径助手的形式中,您将当前用户作为参数传递,而它在您的路由中不存在,因此应该将表单替换为
= form_for user_addresses_path, url: user_addresses_path, method: 'post', :html => { class: "form", :multipart => true } do |f|
我在将自定义表单添加到 Devise edit
页面时遇到问题。目前,我有两个模型 User
和 UserAddress
。我将 edit
页面拆分为多个页面,这是我的路线:
devise_for :users, path: "user", path_names: {sing_in: "sign_in", sing_out: "sign_out", sing_up: "sign_up", edit: "edit"}, :controllers => { :registrations => :registrations }
devise_scope :user do
match 'user/edit' => 'registrations#edit', via: :get, :as => :user_basic
match 'user/edit/addresses' => 'registrations#addresses', via: :get, :as => :user_addresses
...
resources :user_addresses, only: [:create, :destroy]
end
resources :users, path: "user", only: [:show]
我创建了 User Addresses
控制器来处理 create
和 destroy
操作:
class UserAddressesController < ApplicationController
def create
@User = User.find(params[:user_id])
if params[:addresses]
params[:addresses].each do |address|
@User.address.create(address: address)
end
@addresses = @User.addresses
redirect_back(fallback_location: request.referer, notice: "Success")
end
end
def destoy
@address = Address.find(params[:id])
@User = @address.user
@address.destroy
@addresses = Address.where(user_id: @user.id)
respond_to :js
end
end
现在我想添加从 Devise edit
页面添加新地址的功能(我最近会使用 ajax
来更新表格下的记录),像这样(haml
):
= form_for user_addresses_path, url: user_addresses_path(current_user), method: 'post', :html => { class: "form", :multipart => true } do |f|
= f.text_field :name
= f.text_field :address
= f.submit
当我点击 submit
时,出现以下错误:
No route matches [POST] "/user/edit/addresses.1"
我认为我需要将 resources :user_addresses, only: [:create, :destroy]
移出 devise_scope
,但我不想更改 url
(www.url.com/user/edit/addresses).我究竟做错了什么?甚至可以将自定义表单添加到 Devise 中吗?非常感谢您的帮助和时间。
更新:
UserAddress
型号:
class UserAddress < ApplicationRecord
belongs_to :user, :foreign_key => 'user_id'
# Geocoder
geocoded_by :address
after_validation :geocode, :if => lambda{ |obj| obj.address_changed? }
end
这里你的路线 user/edit/address 是从比赛中生成的,是通过 get 方法编写的,所以你需要用
来改变它match 'user/edit/addresses' => 'registrations#addresses', via: :post, :as => :user_addresses
并且在 url 路径助手的形式中,您将当前用户作为参数传递,而它在您的路由中不存在,因此应该将表单替换为
= form_for user_addresses_path, url: user_addresses_path, method: 'post', :html => { class: "form", :multipart => true } do |f|