Rails路由优先级优先于第一个

时间:2018-09-22 10:54:34

标签: ruby-on-rails custom-routes

因此,我一直在研究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

因此,仅当且仅当其路由位于另一个之前时,两个发布操作才起作用。有办法摆脱优先吗?还是我要去哪里错了?

谢谢。

1 个答案:

答案 0 :(得分:1)

  

因此,只有在放置了其路线的情况下,两个发布操作都将起作用   先于其他。

这就是您应该定义的工作路线的方式。因为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