如何获取在Rails中设置为枚举的文件夹下的所有文件名?

时间:2018-09-10 10:11:59

标签: ruby-on-rails ruby

使用Rails 5。

路径下有一些文件:

ls app/assets/
a.jpg b.jpg c.jpg

现在使用这种方式获取模型下的所有文件名:

assets_path = Rails.root.join('app', 'assets')
assets_files = Dir.entries(assets_path).select { |f| !File.directory? f}

enum image: assets_files

但是,不能在index.html.erb中使用这种方式获取真实文件:

- @products.each do |product|
  = product.image

数据库中甚至没有a.jpg数据。

另一个问题,请在_form.html.erb视图中设置以下选择项:

= f.select :image, Product.images.map {|k, v| [k, k]}

它可以显示在html选择项中

<select name='product[image]' id='product_image'>
  <option value='a.jpg'>a.jpg</option>
  <option value='b.jpg'>b.jpg</option>
  <option value='c.jpg'>c.jpg</option>
</select>

但是保存数据后,选择a.jpg时在db中找到1。

有什么问题吗?

1 个答案:

答案 0 :(得分:1)

从文档中:https://api.rubyonrails.org/classes/ActiveRecord/Enum.html

  

声明一个枚举属性,其中值映射到数据库中的整数。

因此,如果您传递数组(您要执行的操作),它将存储给定对象的索引而不是值。

您所能做的就是传递一个散列值:

public class FileDownloader
{
    private string constring = "myconnectionstring";

    public async Task download(string fileName, string directoryName)
    {
        try
        {
            CloudStorageAccount storageAccount = CloudStorageAccount.Parse(constring);
            CloudFileClient fileClient = storageAccount.CreateCloudFileClient();
            CloudFileShare share = fileClient.GetShareReference("myreference");
            string userName = Environment.UserName;


            if (await share.ExistsAsync())
            {
                // Get a reference to the root directory for the share.
                CloudFileDirectory rootDir = share.GetRootDirectoryReference();

                // Get a reference to the directory we created previously.
                CloudFileDirectory sampleDir = rootDir.GetDirectoryReference(directoryName);

                // Ensure that the directory exists.
                if (await sampleDir.ExistsAsync())
                {
                    // Get a reference to the file we created previously.
                    CloudFile file = sampleDir.GetFileReference(fileName);

                    // Ensure that the file exists.
                    if (await file.ExistsAsync())
                    {

                        await file.DownloadToFileAsync(string.Format("C:/Users/" + userName + "/Downloads/{0}", fileName), FileMode.Create);
                    }
                }
            }

        }
        catch (Exception ex)
        {

        }
    }
}