因此,我一直在研究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
因此,仅当且仅当其路由位于另一个之前时,两个发布操作才起作用。有办法摆脱优先吗?还是我要去哪里错了?
谢谢。
答案 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