2016-05-13 1 views
1

Ich verwende die FileStack-API und das Dateiwähler-Juwel (https://github.com/Ink/filepicker-rails). Ich habe ein Attachment-Modell mit einem: Titel als String. Wenn eine Datei hochgeladen wird, wird die URL von der FilePicker-API als Titel gespeichert. Das Juwel verfügt jedoch über eine onchange-Methode, die eine Ereignisvariable als ein JSON-Objekt zurückgibt, das Attribute der Datei enthält. Ich verwende JavaScript, um auf diese Attribute zuzugreifen, aber ich möchte einen Weg in Rails finden, um diese Attribute, auf die über JavaScript zugegriffen wird, in einem Modell zu speichern, so dass ich über den Rest der Rails-App darauf zugreifen kann.Rails effiziente Möglichkeit, JavaScript-Objekt zu Model zu speichern?

<%= filepicker_js_include_tag %> 

<%= simple_form_for(@attachment) do |f| %> 

<%= f.filepicker_field :title, onchange: 'onUpload(event)' %> 
<%= f.submit %> 

<% end %> 

<script> 
function onUpload(event) { 
console.log(event); 
var name = event.fpfile.filename; 
console.log(name); 
} 
</script> 

Update:

So nach in Ihre Lösung suchen und googeln um ich bin mit Ajax die Daten über Routen an den Controller zu senden. Im Folgenden finden Sie mein aktualisiertes Javascript sowie die Route und den Controller. Wenn ich die Instanzvariable @foo rendere und überprüfe, ist sie gleich Null. So werden meine Daten nicht richtig übergeben. Außerdem ist dieser ganze Prozess vom Auslösen der Javascript-Funktion bis zur Anzeige der Indexansicht sehr langsam. Ich denke, dass ich die richtige Idee habe, nachdem ich deine Lösung gesehen und mehr gegraben habe, aber ich vermisse etwas und/oder übertreibe dies. Jeder Rat würde sehr geschätzt werden.

<script> 
    function onUpload(event) { 
    var name = event.fpfile.filename; 
    jQuery.ajax({ 
    data : { data_value: event }, 
    type: 'post', 
    url: "/attachment/index" 
    }); 
} 
</script> 

Strecke

post 'attachments/' => 'attachment#index' 

-Controller

def index 
    @attachments = Attachment.all 
    @foo = params[:data_value] 
end 

Ansicht (nil zurück)

<%= raise @foo.inspect %> 

Antwort

1

Wenn Sie Postgres 9.3 oder über Sie verwenden sollten dasmitModul und Erstellen einer JSON Spalte. In einer Migration können Sie tun:

add_column :your_model, :your_attribute, :json 

Und dann kann man nur YourModel.your_attribute => {'your': 'JSON here'}

Docs hier aktualisieren: http://edgeguides.rubyonrails.org/active_record_postgresql.html#json

Wenn Sie MySQL verwenden, es ist schwierig, aber machbar. Sie müssen eine Textspalte erstellen und die JSON als Zeichenfolge speichern und jedes Mal analysieren, wenn Sie mit ihr interagieren. Postgres ist definitiv besser im Umgang mit JSON. Mir ist klar, dass diese Antwort auf einer Annahme beruht. Wenn Sie also keinen der beiden erwähnten Datenspeicher verwenden, lassen Sie es mich wissen und ich ziehe ihn herunter.

+0

Danke für den Rat. Ich benutze Postgres, seit ich Heroku benutze. Wie würde ich das JavaScript-Objekt, das ich in meiner obigen Funktion erhalte, weitergeben? Der Variablenname? – user3318660

+0

Sie müssten es auf eine Route posten und eine Controller-Aktion einrichten, um das betreffende Objekt zu finden und das Attribut zu aktualisieren. –

+0

Sie können es nicht nur mit Javascript tun. –