简体   繁体   English

如何将这个Ruby文件合并到Rails中?

[英]How do I incorporate this Ruby file into Rails?

I have this Ruby file: 我有这个Ruby文件:

freshdesk.rb: freshdesk.rb:

 require "rest_client"
 require 'nokogiri'

 class Freshdesk

 # custom errors
 class AlreadyExistedError < StandardError; end
 class ConnectionError < StandardError; end

 attr_accessor :base_url

 def initialize(base_url, username, password)

 @base_url = base_url

 RestClient.add_before_execution_proc do | req, params |
  req.basic_auth username, password
 end
end

# Freshdesk API client support "GET" with id parameter optional
#   Returns nil if there is no response
def self.fd_define_get(name, *args)
  name = name.to_s
  method_name = "get_" + name

define_method method_name do |*args| 
  uri = mapping(name)
  uri.gsub!(/.xml/, "/#{args}.xml") if args.size > 0

    begin
      response = RestClient.get uri
    rescue Exception
      response = nil
    end
  end
end

# Freshdesk API client support "DELETE" with the required id parameter
def self.fd_define_delete(name, *args)
  name = name.to_s
  method_name = "delete_" + name

  define_method method_name do |args|
    uri = mapping(name)
    raise StandardError, "An ID is required to delete" if args.size.eql? 0
    uri.gsub!(/.xml/, "/#{args}.xml")
    RestClient.delete uri
  end
end

# Freshdesk API client support "POST" with the optional key, value parameter
#
#  Will throw: 
#    AlreadyExistedError if there is exact copy of data in the server
#    ConnectionError     if there is connection problem with the server
def self.fd_define_post(name, *args)
  name = name.to_s
  method_name = "post_" + name

  define_method method_name do |args|
    raise StandardError, "Arguments are required to modify data" if args.size.eql? 0
    uri = mapping(name)

    builder = Nokogiri::XML::Builder.new do |xml|
      xml.send(doc_name(name)) {
        args.each do |key, value|
          xml.send(key, value)
        end
      }
    end

    begin 
      response = RestClient.post uri, builder.to_xml, :content_type => "text/xml"

    rescue RestClient::UnprocessableEntity
      raise AlreadyExistedError, "Entry already existed"

    rescue RestClient::InternalServerError
      raise ConnectionError, "Connection to the server failed. Please check hostname"

    rescue RestClient::Found
      raise ConnectionError, "Connection to the server failed. Please check username/password"

    rescue Exception => e3
      raise
    end   

    response   
  end
end

# Freshdesk API client support "PUT" with key, value parameter
#
#  Will throw: 
#    ConnectionError     if there is connection problem with the server
def self.fd_define_put(name, *args)
  name = name.to_s
  method_name = "put_" + name

  define_method method_name do |args|
    raise StandardError, "Arguments are required to modify data" if args.size.eql? 0
    raise StandardError, "id is required to modify data" if args[:id].nil?
    uri = mapping(name)

    builder = Nokogiri::XML::Builder.new do |xml|
      xml.send(doc_name(name)) {
        args.each do |key, value|
          xml.send(key, value)
        end
      }
    end

    begin 
      uri.gsub!(/.xml/, "/#{args[:id]}.xml")
      response = RestClient.put uri, builder.to_xml, :content_type => "text/xml"

    rescue RestClient::InternalServerError
      raise ConnectionError, "Connection to the server failed. Please check hostname"

    rescue RestClient::Found
      raise ConnectionError, "Connection to the server failed. Please check username/password"

    rescue Exception => e3
      raise
    end   

    response   
  end
end

[:tickets, :ticket_fields, :users, :forums, :solutions, :companies].each do |a|
  fd_define_get a
  fd_define_post a  
  fd_define_delete a
  fd_define_put a
end


# Mapping of object name to url:
#   tickets => helpdesk/tickets.xml
#   ticket_fields => /ticket_fields.xml
#   users => /contacts.xml
#   forums => /categories.xml
#   solutions => /solution/categories.xml
#   companies => /customers.xml
def mapping(method_name)
  path = case method_name
    when "tickets" then File.join(@base_url + "helpdesk/tickets.xml")
    when "ticket_fields" then File.join( @base_url, "ticket_fields.xml")
    when "users" then File.join(@base_url, "contacts.xml")
    when "forums" then File.join(@base_url + "categories.xml")
    when "solutions" then File.join(@base_url + "solution/categories.xml")
    when "companies" then File.join(@base_url + "customers.xml")
  end
end

# match with the root name of xml document that freskdesk uses
def doc_name(name)
  doc = case name 
      when "tickets" then "helpdesk_ticket"
      when "ticket_fields" then "helpdesk-ticket-fields"
      when "users" then "user"
      when "companies" then "customer"
      else raise StandardError, "No root object for this call"
    end
  end
end

To use it I do: 要使用它我做:

client = Freshdesk.new("http://website.freshdesk.com/", "API KEY", "X") 

# example posts a ticket
client.post_tickets(:subject => 'This is from the rails app',:email => "mytestemail@example.com", :description => "This is from the ruby file bitches", :name => "Richard Ahn", :source => 2, :priority => 2, :name => "Joshua Siler")

Then, in my console I do: 然后,在我的控制台中,我做:

$ ruby freshdesk.rb

The information that gets called with client.post_tickets gets posted to my Freshdesk dashboard. 使用client.post_tickets调用的信息将发布到我的Freshdesk仪表板。

How do I integrate this into my Rails app? 如何将其集成到我的Rails应用程序中?

Where do I put the file with the class name FRESHDESK ? 我在哪里放置类名为FRESHDESK的文件?

What do I do with: 我该怎么办:

client = Freshdesk.new 
client.post_tickets 

How do I link this up with a form that the user can submit? 如何将其与用户可以提交的表单相关联?

File should go in the lib folder. 文件应该放在lib文件夹中。

Now, to get data from a form, I'll first create a form. 现在,要从表单中获取数据,我将首先创建一个表单。

<%= form_for(@client) do |f| %>
  <%= f.label :subject %>
  <%= f.text_field :subject %>
  <%= f.label :name%>
  <%= f.text_field :name %>
  <%= f.label :description %>
  <%= f.text_field :description %>
  ...
<% end %>

and in the controller where the @client POST for new record (create method) enter this code 并在控制器中,新记录的@client POST (创建方法)输入此代码

def create
  client = Freshdesk.new "http://website.freshdesk.com/", "API KEY", "X"
  client.post_tickets(params[:client])
  ...
end

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM