2016-05-13 2 views
1

J'utilise l'API FileStack et la gemme de sélection de fichier (https://github.com/Ink/filepicker-rails). J'ai un modèle d'attachement qui a un: title en tant que chaîne. Lorsqu'un fichier est téléchargé, l'URL de l'API FilePicker est stockée sous le titre:. Mais la gem possède une méthode onchange qui renvoie une variable d'événement en tant qu'objet JSON contenant des attributs du fichier. J'utilise JavaScript pour accéder à ces attributs, mais je veux trouver un moyen de stocker dans Rails ces attributs, accessibles via JavaScript, dans un modèle afin que je puisse y accéder via le reste de l'application Rails.Rails moyen efficace pour stocker l'objet JavaScript au modèle?

<%= 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> 

Mise à jour:

Alors après avoir regardé dans votre solution et googler J'utilise autour ajax pour envoyer les données par des voies au contrôleur. Voici mon Javascript mis à jour ainsi que l'itinéraire et le contrôleur. Lorsque je rends et inspectons la variable d'instance @foo, elle est nulle. Donc mes données ne sont pas transmises correctement. De plus, tout ce processus depuis le lancement de la fonction Javascript jusqu'à l'affichage de l'index est maintenant très très lent. Je pense avoir la bonne idée après avoir vu votre solution et avoir creusé plus mais il me manque quelque chose et/ou trop compliqué. Tout conseil serait très apprécié.

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

Route

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

Contrôleur

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

View (renvoie nil)

<%= raise @foo.inspect %> 

Répondre

1

Si vous utilisez Postgres 9.3 ou au-dessus vous devriez envisager d'utiliser le hstore et en créant une colonne JSON. Dans une migration que vous pouvez faire:

add_column :your_model, :your_attribute, :json 

Et vous pouvez simplement mettre à jour YourModel.your_attribute => {'your': 'JSON here'}

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

Si vous utilisez MySQL il est difficile, mais faisable. Vous devez créer une colonne de texte et enregistrer le JSON comme une chaîne, et l'analyser chaque fois que vous interagissez avec elle. Postgres est certainement mieux à gérer JSON. Je me rends compte que cette réponse repose sur une hypothèse, donc si vous n'utilisez pas l'un des deux magasins de données mentionnés, faites le moi savoir et je vais le retirer.

+0

Merci pour le conseil. J'utilise postgres depuis que j'utilise Heroku. Alors, comment je passerais dans l'objet JavaScript que j'obtiens dans ma fonction ci-dessus? Le nom de la variable? – user3318660

+0

Vous devez le publier sur un itinéraire et configurer une action du contrôleur pour trouver l'objet en question et mettre à jour l'attribut. –

+0

Vous ne pouvez pas le faire seulement avec Javascript. –