Ruby on rails 文件不存在';创建时不附加,但在更新时附加zendesk
工作流程应该是:用户应该能够将文件附加到zendesk票证上的评论,无论它是新票证还是现有票证 目前,将文件附加到现有票证上的注释效果非常好。但是,如果查看“创建”操作,它就无法附加文件了。它不会抛出错误,只是不会附加文件。我确信这是我的代码流动的方式,但我无法理解Ruby on rails 文件不存在';创建时不附加,但在更新时附加zendesk,ruby-on-rails,ruby,zendesk,zendesk-api,Ruby On Rails,Ruby,Zendesk,Zendesk Api,工作流程应该是:用户应该能够将文件附加到zendesk票证上的评论,无论它是新票证还是现有票证 目前,将文件附加到现有票证上的注释效果非常好。但是,如果查看“创建”操作,它就无法附加文件了。它不会抛出错误,只是不会附加文件。我确信这是我的代码流动的方式,但我无法理解 require_dependency 'zen_support/application_controller' module ZenSupport class TicketsController < Applicatio
require_dependency 'zen_support/application_controller'
module ZenSupport
class TicketsController < ApplicationController
include SmartListing::Helper::ControllerExtensions
helper SmartListing::Helper
before_action :authenticate_user!, except: :zen_update
before_action :set_new_ticket, only: [:new, :create]
before_action :get_ticket, only: [:show, :edit, :update, :zen_update]
before_action :authorize_ticket, except: :zen_update
rescue_from ZendeskAPI::Error::NetworkError, with: :network_error
def new
respond_to do |format|
format.js
end
end
def index
if zen_list_type == 'datatable'
@tickets = tickets
else
smart_listing
end
respond_to do |format|
format.html
format.js
end
end
def create
if(!@ticket.valid? && (@ticket.errors.keys - [:zendesk_id]).present?)
# test if ticket is invalid beyond just missing zendesk_id
raise ActiveRecord::RecordInvalid.new @ticket
else
ActiveRecord::Base.transaction do
@zendesk_ticket.save!
upload_to_zendesk(params[:comment], params[:attachments])
@ticket.zendesk_id = @zendesk_ticket.id
@ticket.status = @zendesk_ticket.status
@ticket.save!
smart_listing
flash.now[:success] = "Your help request was successfully submitted.\n
Your support ticket number is ##{@zendesk_ticket.id}.\n\n
You should receive a confirmation email shortly.\n\n
Thank you!"
end
end
rescue Exception => exception
flash.now[:error] = exception.to_s
@zendesk_ticket.delete if @zendesk_ticket.id
render :new
end
def show
render action: :edit
end
def update
respond_to do |format|
format.js do
# don't save over comment, just use the field for validation
upload_to_zendesk(params[:comment], params[:attachments])
@zendesk_ticket.update(ticket_update_params)
if @ticket.valid? && @zendesk_ticket.save! && @ticket.update(updated_at: Time.now)
flash.now[:success] = "Your help request was successfully updated.\n
Your support ticket number is ##{@zendesk_ticket.id}.\n\n
You should receive a confirmation email shortly.\n\n
Thank you!"
else
flash.now[:error] = if @ticket.errors.present?
@ticket.errors.full_messages.join "\n"
else
'There was a problem sending out your request.'
end
render action: :edit
end
end
end
end
def zen_update
ZenSupport::Ticket.find_by(
zendesk_id: params[:id]
)&.update(zen_update_params)
render nothing: true
end
def network_error
flash.now[:error] = 'There was a network error connecting to the Zendesk API. Try again later.'
render 'network_error'
end
private
def upload_to_zendesk(comment_body, files)
@zendesk_ticket.comment = { value: comment_body }
Array(files).each do |file|
@zendesk_ticket.comment.uploads << file
end
end
def tickets
ZenSupport::Ticket.where user: current_user
end
def smart_listing
smart_listing_create(
:support_tickets,
tickets,
partial: 'zen_support/tickets/list',
array: tickets.count != 0
# we want to use array: true if there are records present because it pre-renders the activerecord
# objects so we can do sorting on the encrypted field 'subject'. BUT, if there are no records,
# then array: true gives us a pagination error
)
end
def ticket_params
{
subject: subject,
comment: comment,
zendesk_id: zendesk_id,
zendesk_submitter_id: submitter_id,
ticket_type: ticket_type,
priority: priority,
tags: tags,
user: current_user
}
end
def zendesk_ticket_params
{
subject: subject,
type: ticket_type,
comment: { value: comment },
submitter_id: submitter_id,
requester_id: requester_id,
priority: priority,
tags: tags
}
end
def ticket_update_params
{
comment: {
body: params[:comment],
author_id: zendesk_user.id
}
}
end
def zen_update_params
{
zendesk_id: zendesk_id,
status: @zendesk_ticket.status,
priority: @zendesk_ticket.priority,
updated_at: @zendesk_ticket.updated_at
}
end
def subject
params.dig :zen_support_ticket, :subject
end
def comment
params.dig :zen_support_ticket, :comment
end
def zendesk_id
@zendesk_ticket.id
end
def tags
[
*params.dig(:zen_support_ticket, :tags),
*ZenSupport.configuration.options[:support_ticket_attributes][:static_tags]
]
end
def ticket_type
params.dig(:zen_support_ticket, :ticket_type).to_s.downcase
end
def set_new_ticket
@zendesk_ticket = ZendeskAPI::Ticket.new(
zen_client, zendesk_ticket_params
)
@ticket = ZenSupport::Ticket.new(ticket_params)
end
def get_ticket
@zendesk_ticket = ZendeskAPI::Ticket.find!(
zen_client,
id: params[:id]
)
@ticket = ZenSupport::Ticket.find_by!(zendesk_id: params[:id])
end
def priority
(params.dig(:zen_support_ticket, :priority) || ZenSupport.configuration.options[:support_ticket_attributes][:default_priority]).downcase
end
def submitter_id
zendesk_user.id
end
def requester_id
zendesk_user.id
end
def user_params
params.require(:zen_support_user).permit(tags: [])
end
def zendesk_user
@zendesk_user ||= (get_zendesk_user || create_zendesk_user)
end
def get_zendesk_user
zen_client.users.search(
query: "email:#{zen_current_user.email}"
).first
end
def create_zendesk_user
ZendeskAPI::User.create(
zen_client,
email: zen_current_user.email,
name: zen_current_user.full_name,
tags: user_tags
)
end
def user_tags
ZenSupport.configuration.user_setup[:static_tags]
end
def authorize_ticket
authorize Ticket
end
end
end
需要依赖项“zen\u支持/应用程序\u控制器”
模块支持
类ticketcontroller异常
flash.now[:error]=异常
@zendesk_ticket.delete if@zendesk_ticket.id
渲染:新
结束
def秀
渲染操作::编辑
结束
def更新
回应待办事项|格式|
format.js do
#不要保存过多的注释,只需使用该字段进行验证
上传到zendesk(参数[:注释],参数[:附件])
@zendesk_ticket.update(ticket_update_参数)
如果@ticket.valid?&&@zendesk_ticket.save!&&@票证更新(更新时间:Time.now)
flash.now[:success]=“您的帮助请求已成功更新。\n
您的支持票号是##{@zendesk_ticket.id}。\n\n
您很快就会收到一封确认电子邮件。\n\n
谢谢!"
其他的
flash.now[:error]=if@ticket.errors.present?
@ticket.errors.full_messages.join“\n”
其他的
“发送您的请求时出现问题。”
结束
渲染操作::编辑
结束
结束
结束
结束
def zen_更新
ZenSupport::Ticket.find_by(
zendesk_id:params[:id]
)&.update(zen_update_参数)
不渲染:真
结束
def网络错误
flash.now[:error]=“连接到Zendesk API时出现网络错误。请稍后再试。”
呈现“网络错误”
结束
私有的
def上传至zendesk(评论正文、文件)
@zendesk_ticket.comment={value:comment_body}
数组(文件)。每个do |文件|
@zendesk_ticket.comment.uploads尝试将这一行添加到您的创建方法中
def create
if(!@ticket.valid? && (@ticket.errors.keys - [:zendesk_id]).present?)
# test if ticket is invalid beyond just missing zendesk_id
raise ActiveRecord::RecordInvalid.new @ticket
else
ActiveRecord::Base.transaction do
@zendesk_ticket.save!
upload_to_zendesk(params[:comment], params[:attachments])
@zendesk_ticket.save!
...
呃,难道没有别的办法吗?我觉得这种方式可能不是最佳实践。如果您喜欢最佳实践,您的代码将有很多更改。您可以从Autosave关联()开始。您的模型结构没有显示,所以我无法提供其他信息。对。不幸的是,对create操作进行更改时,这不起作用