У меня есть страница /users/:id в качестве страницы показа для пользователей. На странице шоу я пытаюсь обновить 2 таблицы в базе данных. В конце будет 4 стола. Я использую для этого эти маршруты.

devise_for :users
resources :users, only: [:show] 

patch '/users/:id' => 'companyinfos#update'
post '/users/:id' => 'companyinfos#update'
patch '/users/:id' => 'socials#update'
post '/users/:id' => 'socials#update'

При этом у меня возникает ошибка. Если я пытаюсь обновить информацию для socials#update, он направляет меня к методу companyinfos#update, но когда я обновляю информацию о компании, он работает нормально. Я предполагаю, потому что первым указал маршрут companyinfos. Как правильно перейти в одно и то же место и обновить несколько методов.

0
Goeken 13 Янв 2018 в 05:26

1 ответ

Лучший ответ

Вам следует обновлять все за 1 действие, используя вложенные атрибуты Active Record. .

## config/routes.rb
devise_for :users
resources :users, only: [:show, :create, :update] 


## models/user.rb
class User < ApplicationRecord
  accepts_nested_attributes_for :companyinfos, :socials
end

## controllers/users_controller.rb
class UsersController < ApplicationController
  .........

  def create
    @user = User.new(user_params)
    if @user.save
      .........
  end

  def update
    if @user.update(user_params)
      ......
  end

  private

  def user_params
    ## companyinfos_attributes and socials_attributes are generated by using `accepts_nested_attributes_for`
    params.require(:user).permit(:name, :abc, :xyz, companyinfos_attributes: [:id, :name, ...], socials_attributes: [:id, :name, ...])
  end
end


## users/_form.html.erb

<%= form_for user do |f| %>
  <%= f.input_field :name %>
  <%= f.input_field :abc %>
  <%= f.input_field :xyz %>
  ....

  <%= f.fields_for :companyinfos do |ff| %>
    <%= ff.input_field :name %> # This is companyinfos.name not user.name
  <% end %>


  <%= f.fields_for :socials do |ff| %>
    <%= ff.input_field :name %>
  <% end %>

<% end %>

Это хороший скринкаст. [ссылка]

2
13 Янв 2018 в 08:15