Добавление пользовательской формы на страницу редактирования Devise Ruby on Rails - PullRequest
0 голосов
/ 18 июня 2019

У меня проблема с добавлением пользовательской формы на страницу 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? Большое спасибо за вашу помощь и время.

UPDATE:

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

1 Ответ

1 голос
/ 18 июня 2019

Здесь ваш маршрут 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|
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...