Итак, я работал над проектом rails, который определяет два разных действия create в одном контроллере. Вот мой контроллер:

class SmsSendsController < ApplicationController
  def new
    @at = SmsSend.new
    @contact = Contact.find_by(id: params[:id])
  end
  def create
    @at = SmsSend.create(sms_params)
    if @at.save!
    @con = current_user.contacts.find_by(id: @at.contact_id)
    AfricasTalkingGateway.new("trial-error").sendMessage(@con.phonenumber, @at.message)
    end
  end
  def new_all
    @at = SmsSend.new
    @contact = Contact.find_by(id: params[:id])
  end
  def create_all
    @at = SmsSend.create(sms_params)
    if @at.save!
    current_user.contacts.each do |c|
      AfricasTalkingGateway.new("trial-error").sendMessage(c.phonenumber, @at.message)
    end
    end
 end

  private
  def sms_params
    params.require(:sms_send).permit(:mobile, :message, :contact_id)
  end
end

В моем

routes.rb

В файле Ive использовал как настраиваемые, так и находчивые маршруты для определения маршрутов для первого и второго действий new / create:

Rails.application.routes.draw do
  devise_for :users
  get 'sms_sends/new_all', to: 'sms_sends#new_all'
  post 'sms_sends', to: 'sms_sends#create_all'
  resources :contacts
  resources :sms_sends
  root 'contacts#index'
end

Таким образом, оба действия post будут работать тогда и только тогда, когда их маршруты размещены перед другим. Есть ли способ избавиться от приоритета? Или где я ошибаюсь?

Спасибо.

3
Getty Orawo 22 Сен 2018 в 13:54

1 ответ

Лучший ответ

Таким образом, оба действия post будут работать тогда и только тогда, когда их маршруты размещены перед другим.

Вот как вы должны определить, чтобы маршруты работали. Поскольку маршруты, определенные в routes.rb, будут компилироваться сверху вниз . Таким образом, если вашим пользовательским маршрутам предшествует находчивый маршрут , то пользовательские маршруты будут конфликтовать с вашими изобретательными маршрутами.

Есть ли способ избавиться от приоритета?

Определите их как маршруты сбора вот так:

resources :sms_sends do
  get 'sms_sends/new_all', to: 'sms_sends#new_all', on: :collection
  post 'sms_sends', to: 'sms_sends#create_all', on: :collection
end

Вышеуказанное будет генерировать маршруты с помощью помощников пути, как показано ниже.

sms_sends_new_all_sms_sends   GET    /sms_sends/sms_sends/new_all(.:format)   sms_sends#new_all
sms_sends_sms_sends           POST   /sms_sends/sms_sends(.:format)           sms_sends#create_all

Для лучшей читаемости вы можете изменить свои собственные маршруты следующим образом

resources :sms_sends do
  get 'new_all', to: 'sms_sends#new_all', on: :collection
  post 'create_all', to: 'sms_sends#create_all', on: :collection
end

Это сгенерирует помощников пути, как показано ниже

new_all_sms_sends             GET    /sms_sends/new_all(.:format)      sms_sends#new_all
create_all_sms_sends          POST   /sms_sends/create_all(.:format)   sms_sends#create_all
2
Pavan 22 Сен 2018 в 12:06