質問編集履歴

6 情報の追加

s_diff

s_diff score 107

2019/02/25 13:56  投稿

[Rails]public以下の画像ファイルをビューで取得してコントローラに渡しDBに保存したい
Rails初学者です。
public以下にある画像ファイルを、ビューでパスから取得してコントローラに渡し、DBに保存したいと思っています。
public以下にある画像ファイルを、ビューでパスから取得してsortableで並び替えてコントローラに渡し、DBに保存したいと思っています。
###手順
1. new.html.erbで画像ファイル以外のカラムの値を入力してsortコントローラに送信
2. sortメソッドでpublic以下にユニークなフォルダを作成して画像データをその中に一旦退避
3. sort.html.erbに遷移してpublicのファルダ以下にある画像データを取得してjqueryのSortableで並び替え
4. コントローラのcreateにparamsを渡してDBに保存
という流れで実装しようと考えています。
```ruby
 def new
   @product = Product.new
 end
 def sort
   @product = Product.new(product_params)
   products_images = params[:products_images]
   dirname = SecureRandom.hex(20)
   FileUtils.mkdir_p("public/#{dirname}", :mode => 755)
   @img_path_arr = []
   products_images.each do |img|
     name = img.original_filename
     output_path = Rails.root.join("public/#{dirname}", name)
     File.open(output_path, 'wb'){ |f| f.write(img.read) }
     @img_path_arr.push("/#{dirname}/#{name}")
   end
 end
def create
   @product = Product.new(product_params)
   if params[:products_images].present? && params[:products_images].size <= 30
     num = 1
     params[:products_images].each do |img|
       @product.send("products_image#{num}=", img)
       num += 1
     end
   end
   respond_to do |format|
     if @product.save
       format.html { redirect_to [:manage, @product], notice: "#{@product.building_name}を作成しました。" }
       format.json { render :show, status: :created, location: @product }
     else
       format.html { render :pre_sort }
       format.json { render json: @product.errors, status: :unprocessable_entity }
     end
   end
 end
```
```ruby
# sort.html.erb
<%= form_for(@product, url: { action: "create"}, html: { multipart: true }) do |f| %>
   <div class="file-upload-area">
      <% @img_path_arr.each do |path| %>
     <div class="sortable">
         <div class="sort-box">
           <input type="text" class="form-control" readonly="" />
           <div style='border: dashed 1px #ccc;'>
             <% f = File.binread(Rails.root.join("public/#{path}")).chomp %>
             <%= hidden_field_tag 'products_images[]', value: f, class: 'uploadFile', style: 'width: 90px; font-size: 16px;' %>
             <div class="imagePreview item" style='padding: 0; background-image: url(<%= path %>)'></div>
           </div>
         </div>
       </div>
     <% end %>
   </div>
   <%= f.hidden_field :building_name, value: @product.building_name %>
   <%= f.hidden_field :address, value: @product.address %>
 </div>
 <div class="actions">
   <%= button_tag type: 'submit', class: "btn-edit" do %>
     <i class="fa fa-pencil" aria-hidden="true"></i> 作成
   <% end %>
 </div>
<% end %>
```
###問題点
上記のように実装してみたのですが、下から9行目
<%= f.hidden_field :building_name, value: @product.building_name %>
の部分で
undefined method `hidden_field' for #<String:0x007f9600b59ad0>
というエラーが出ます。
###試したこと
・下から9行目のhidden_fieldを削除すると、下から10行目のhidden_fieldで同じエラーがでました。
・どちらも削除すると、コントローラに送信した際に固まってしまいました。
・sortメソッドにparamsは問題なく渡っています。
###知りたいこと
以下のようなものがもしあれば知りたいです。
・ public以下の画像ファイルをビューで画像ファイルデータとして取得する方法
・ こういったイレギュラーなファイル操作をしようとする時に勉強しておくと良い本や学習コンテンツ
・ もっと簡単な方法
ご教示いただけることがあれば何卒よろしくお願いいたします。
  • Ruby on Rails

    14830 questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

5 情報を追加

s_diff

s_diff score 107

2019/02/25 12:18  投稿

[Rails]public以下の画像ファイルをビューで取得してコントローラに渡しDBに保存したい
Rails初学者です。
public以下にある画像ファイルを、ビューでパスから取得してコントローラに渡し、DBに保存したいと思っています。
###手順
1. new.html.erbで画像ファイル以外のカラムの値を入力してsortコントローラに送信
2. sortメソッドでpublic以下にユニークなフォルダを作成して画像データをその中に一旦退避
3. sort.html.erbに遷移してpublicのファルダ以下にある画像データを取得してjqueryのSortableで並び替え
4. コントローラのcreateにparamsを渡してDBに保存
という流れで実装しようと考えています。
```ruby
 def new
   @product = Product.new
 end
 def sort
   @product = Product.new(product_params)
   products_images = params[:products_images]
   dirname = SecureRandom.hex(20)
   FileUtils.mkdir_p("public/#{dirname}", :mode => 755)
   @img_path_arr = []
   products_images.each do |img|
     name = img.original_filename
     output_path = Rails.root.join("public/#{dirname}", name)
     File.open(output_path, 'wb'){ |f| f.write(img.read) }
     @img_path_arr.push("/#{dirname}/#{name}")
   end
 end
def create
   @product = Product.new(product_params)
   if params[:products_images].present? && params[:products_images].size <= 30
     num = 1
     params[:products_images].each do |img|
       @product.send("products_image#{num}=", img)
       num += 1
     end
   end
   respond_to do |format|
     if @product.save
       format.html { redirect_to [:manage, @product], notice: "#{@product.building_name}を作成しました。" }
       format.json { render :show, status: :created, location: @product }
     else
       format.html { render :pre_sort }
       format.json { render json: @product.errors, status: :unprocessable_entity }
     end
   end
 end
```
```ruby
# sort.html.erb
<%= form_for(@product, url: { action: "create"}, html: { multipart: true }) do |f| %>
   <div class="file-upload-area">
      <% @img_path_arr.each do |path| %>
     <div class="sortable">
         <div class="sort-box">
           <input type="text" class="form-control" readonly="" />
           <div style='border: dashed 1px #ccc;'>
             <% f = File.binread(Rails.root.join("public/#{path}")).chomp %>
             <%= hidden_field_tag 'products_images[]', value: f, class: 'uploadFile', style: 'width: 90px; font-size: 16px;' %>
             <div class="imagePreview item" style='padding: 0; background-image: url(<%= path %>)'></div>
           </div>
         </div>
       </div>
     <% end %>
   </div>
   <%= f.hidden_field :building_name, value: @product.building_name %>
   <%= f.hidden_field :address, value: @product.address %>
 </div>
 <div class="actions">
   <%= button_tag type: 'submit', class: "btn-edit" do %>
     <i class="fa fa-pencil" aria-hidden="true"></i> 作成
   <% end %>
 </div>
<% end %>
```
###問題点
上記のように実装してみたのですが、下から9行目
<%= f.hidden_field :building_name, value: @product.building_name %>
の部分で
undefined method `hidden_field' for #<String:0x007f9600b59ad0>
というエラーが出ます。
###試したこと
・下から9行目のhidden_fieldを削除すると、下から10行目のhidden_fieldで同じエラーがでました。
・どちらも削除すると、コントローラに送信した際に固まってしまいました。
・sortメソッドにparamsは問題なく渡っています。
###知りたいこと
以下の二点が知りたいです。
以下のようなものがもしあれば知りたいです。
・ public以下の画像ファイルをビューで画像ファイルデータとして取得する方法
・ こういったイレギュラーなファイル操作をしようとする時に勉強しておくと良い本や学習コンテンツ
・ もっと簡単な方法  
ご教示いただけることがあれば何卒よろしくお願いいたします。
  • Ruby on Rails

    14830 questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

4 情報の追加

s_diff

s_diff score 107

2019/02/25 12:07  投稿

[Rails]public以下の画像ファイルをビューで取得してコントローラに渡しDBに保存したい
Rails初学者です。
public以下にある画像ファイルを、ビューでパスから取得してコントローラに渡し、DBに保存したいと思っています。
###手順
1. new.html.erbで画像ファイル以外のカラムの値を入力してsortコントローラに送信
2. sortメソッドでpublic以下にユニークなフォルダを作成して画像データをその中に一旦退避
3. sort.html.erbに遷移してpublicのファルダ以下にある画像データを取得
3. sort.html.erbに遷移してpublicのファルダ以下にある画像データを取得してjqueryのSortableで並び替え
4. コントローラのcreateにparamsを渡してDBに保存
という流れで実装しようと考えています。
```ruby
 def new
   @product = Product.new
 end
 def sort
   @product = Product.new(product_params)
   products_images = params[:products_images]
   dirname = SecureRandom.hex(20)
   FileUtils.mkdir_p("public/#{dirname}", :mode => 755)
   @img_path_arr = []
   products_images.each do |img|
     name = img.original_filename
     output_path = Rails.root.join("public/#{dirname}", name)
     File.open(output_path, 'wb'){ |f| f.write(img.read) }
     @img_path_arr.push("/#{dirname}/#{name}")
   end
 end
def create
   @product = Product.new(product_params)
   if params[:products_images].present? && params[:products_images].size <= 30
     num = 1
     params[:products_images].each do |img|
       @product.send("products_image#{num}=", img)
       num += 1
     end
   end
   respond_to do |format|
     if @product.save
       format.html { redirect_to [:manage, @product], notice: "#{@product.building_name}を作成しました。" }
       format.json { render :show, status: :created, location: @product }
     else
       format.html { render :pre_sort }
       format.json { render json: @product.errors, status: :unprocessable_entity }
     end
   end
 end
```
```ruby
# sort.html.erb
<%= form_for(@product, url: { action: "create"}, html: { multipart: true }) do |f| %>
   <div class="file-upload-area">
      <% @img_path_arr.each do |path| %>
        <div class="sort-box">
          <input type="text" class="form-control" readonly="" />
          <div style='border: dashed 1px #ccc;'>
            <% f = File.binread(Rails.root.join("public/#{path}")).chomp %>
            <%= hidden_field_tag 'products_images[]', value: f, class: 'uploadFile', style: 'width: 90px; font-size: 16px;' %>
            <div class="imagePreview item" style='padding: 0; background-image: url(<%= path %>)'></div>
          </div>
        </div>
       <% end %>
     <div class="sortable">
         <div class="sort-box">
           <input type="text" class="form-control" readonly="" />
           <div style='border: dashed 1px #ccc;'>
             <% f = File.binread(Rails.root.join("public/#{path}")).chomp %>
             <%= hidden_field_tag 'products_images[]', value: f, class: 'uploadFile', style: 'width: 90px; font-size: 16px;' %>
             <div class="imagePreview item" style='padding: 0; background-image: url(<%= path %>)'></div>
           </div>
         </div>
       </div>
     <% end %>
   </div>
   <%= f.hidden_field :building_name, value: @product.building_name %>
   <%= f.hidden_field :address, value: @product.address %>
 </div>
 <div class="actions">
   <%= button_tag type: 'submit', class: "btn-edit" do %>
     <i class="fa fa-pencil" aria-hidden="true"></i> 作成
   <% end %>
 </div>
<% end %>
```
###問題点
上記のように実装してみたのですが、下から9行目
<%= f.hidden_field :building_name, value: @product.building_name %>
の部分で
undefined method `hidden_field' for #<String:0x007f9600b59ad0>
というエラーが出ます。
###試したこと
・下から9行目のhidden_fieldを削除すると、下から10行目のhidden_fieldで同じエラーがでました。
・どちらも削除すると、コントローラに送信した際に固まってしまいました。
・sortメソッドにparamsは問題なく渡っています。
###知りたいこと
以下の二点が知りたいです。
・ public以下の画像ファイルをビューで画像ファイルデータとして取得する方法
・ こういったイレギュラーなファイル操作をしようとする時に勉強しておくと良い本や学習コンテンツ
ご教示いただけることがあれば何卒よろしくお願いいたします。
  • Ruby on Rails

    14830 questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

3 情報の追加

s_diff

s_diff score 107

2019/02/25 11:47  投稿

[Rails]public以下の画像ファイルをビューで取得してコントローラに渡しDBに保存したい
Rails初学者です。
public以下にある画像ファイルを、ビューでパスから取得してコントローラに渡し、DBに保存したいと思っています。
###手順
1. new.html.erbで画像ファイル以外のカラムの値を入力してsortコントローラに送信
2. sortメソッドでpublic以下にユニークなフォルダを作成して画像データをその中に一旦退避
3. sort.html.erbに遷移してpublicのファルダ以下にある画像データを取得
4. コントローラのcreateにparamsを渡してDBに保存
という流れで実装しようと考えています。
```ruby
 def new
   @product = Product.new
 end
 def sort
   @product = Product.new(product_params)
   products_images = params[:products_images]
   dirname = SecureRandom.hex(20)
   FileUtils.mkdir_p("public/#{dirname}", :mode => 755)
   @img_path_arr = []
   products_images.each do |img|
     name = img.original_filename
     output_path = Rails.root.join("public/#{dirname}", name)
     File.open(output_path, 'wb'){ |f| f.write(img.read) }
     @img_path_arr.push("/#{dirname}/#{name}")
   end
 end
def create
   @product = Product.new(product_params)
   if params[:products_images].present? && params[:products_images].size <= 30
     num = 1
     params[:products_images].each do |img|
       @product.send("products_image#{num}=", img)
       num += 1
     end
   end
   respond_to do |format|
     if @product.save
       format.html { redirect_to [:manage, @product], notice: "#{@product.building_name}を作成しました。" }
       format.json { render :show, status: :created, location: @product }
     else
       format.html { render :pre_sort }
       format.json { render json: @product.errors, status: :unprocessable_entity }
     end
   end
 end
```
```ruby
# sort.html.erb
<%= form_for(@product, url: { action: "create"}, html: { multipart: true }) do |f| %>
   <div class="file-upload-area">
      <% @img_path_arr.each do |path| %>
        <div class="sort-box">
          <input type="text" class="form-control" readonly="" />
          <div style='border: dashed 1px #ccc;'>
            <% f = File.binread(Rails.root.join("public/#{path}")).chomp %>
            <%= hidden_field_tag 'products_images[]', value: f, class: 'uploadFile', style: 'width: 90px; font-size: 16px;' %>
            <div class="imagePreview item" style='padding: 0; background-image: url(<%= path %>)'></div>
          </div>
        </div>
       <% end %>
   </div>
   <%= f.hidden_field :building_name, value: @product.building_name %>
   <%= f.hidden_field :address, value: @product.address %>
 </div>
 <div class="actions">
   <%= button_tag type: 'submit', class: "btn-edit" do %>
     <i class="fa fa-pencil" aria-hidden="true"></i> 作成
   <% end %>
 </div>
<% end %>
```
###問題点
上記のように実装してみたのですが、下から9行目
<%= f.hidden_field :building_name, value: @product.building_name %>
の部分で
undefined method `hidden_field' for #<String:0x007f9600b59ad0>
というエラーが出ます。
###試したこと
・下から9行目のhidden_fieldを削除すると、下から10行目のhidden_fieldで同じエラーがでました。
・どちらも削除すると、コントローラに送信した際に固まってしまいました。
・sortメソッドにparamsは問題なく渡っています。  
###知りたいこと
以下の二点が知りたいです。
・ public以下の画像ファイルをビューで画像ファイルデータとして取得する方法
・ こういったイレギュラーなファイル操作をしようとする時に勉強しておくと良い本や学習コンテンツ
ご教示いただけることがあれば何卒よろしくお願いいたします。
  • Ruby on Rails

    14830 questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

2 情報に不足があったため

s_diff

s_diff score 107

2019/02/25 11:42  投稿

[Rails]public以下の画像ファイルをビューで取得してコントローラに渡しDBに保存したい
Rails初学者です。
public以下にある画像ファイルを、ビューでパスから取得してコントローラに渡し、DBに保存したいと思っています。
###手順
1. new.html.erbで画像ファイル以外のカラムの値を入力して送信
2. sort.html.erbに遷移してpublicのファルダ以下にある画像データを取得
3. コントローラのcreateにparamsを渡してDBに保存
1. new.html.erbで画像ファイル以外のカラムの値を入力してsortコントローラに送信
2. sortメソッドでpublic以下にユニークなフォルダを作成して画像データをその中に一旦退避
3. sort.html.erbに遷移してpublicのファルダ以下にある画像データを取得
4. コントローラのcreateにparamsを渡してDBに保存
という流れで実装しようと考えています。
```ruby
 def new
   @product = Product.new
 end
 def sort
   @product = Product.new(product_params)
   products_images = params[:products_images]
   dirname = SecureRandom.hex(20)
   FileUtils.mkdir_p("public/#{dirname}", :mode => 755)
   @img_path_arr = []
   products_images.each do |img|
     name = img.original_filename
     output_path = Rails.root.join("public/#{dirname}", name)
     File.open(output_path, 'wb'){ |f| f.write(img.read) }
     @img_path_arr.push("/#{dirname}/#{name}")
   end
 end
def create
   @product = Product.new(product_params)
   if params[:products_images].present? && params[:products_images].size <= 30
     num = 1
     params[:products_images].each do |img|
       @product.send("products_image#{num}=", img)
       num += 1
     end
   end
   respond_to do |format|
     if @product.save
       format.html { redirect_to [:manage, @product], notice: "#{@product.building_name}を作成しました。" }
       format.json { render :show, status: :created, location: @product }
     else
       format.html { render :pre_sort }
       format.json { render json: @product.errors, status: :unprocessable_entity }
     end
   end
 end
```
```ruby
# sort.html.erb
<%= form_for(@product, url: { action: "create"}, html: { multipart: true }) do |f| %>
   <div class="file-upload-area">
      <% @img_path_arr.each do |path| %>
        <div class="sort-box">
          <input type="text" class="form-control" readonly="" />
          <div style='border: dashed 1px #ccc;'>
            <% f = File.binread(Rails.root.join("public/#{path}")).chomp %>
            <%= hidden_field_tag 'products_images[]', value: f, class: 'uploadFile', style: 'width: 90px; font-size: 16px;' %>
            <div class="imagePreview item" style='padding: 0; background-image: url(<%= path %>)'></div>
          </div>
        </div>
       <% end %>
   </div>
   <%= f.hidden_field :building_name, value: @product.building_name %>
   <%= f.hidden_field :address, value: @product.address %>
 </div>
 <div class="actions">
   <%= button_tag type: 'submit', class: "btn-edit" do %>
     <i class="fa fa-pencil" aria-hidden="true"></i> 作成
   <% end %>
 </div>
<% end %>
```
###問題点
上記のように実装してみたのですが、下から9行目
<%= f.hidden_field :building_name, value: @product.building_name %>
の部分で
undefined method `hidden_field' for #<String:0x007f9600b59ad0>
というエラーが出ます。
###試したこと
・下から9行目のhidden_fieldを削除すると、下から10行目のhidden_fieldで同じエラーがでました。
・どちらも削除すると、コントローラに送信した際に固まってしまいました。
###知りたいこと
以下の二点が知りたいです。
・ public以下の画像ファイルをビューで画像ファイルデータとして取得する方法
・ こういったイレギュラーなファイル操作をしようとする時に勉強しておくと良い本や学習コンテンツ
ご教示いただけることがあれば何卒よろしくお願いいたします。
  • Ruby on Rails

    14830 questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

1 情報追加

s_diff

s_diff score 107

2019/02/25 11:33  投稿

[Rails]public以下の画像ファイルをビューで取得してコントローラに渡しDBに保存したい
Rails初学者です。
public以下にある画像ファイルを、ビューでパスから取得してコントローラに渡し、DBに保存したいと思っています。
###手順
1. new.html.erbで画像ファイル以外のカラムの値を入力して送信
2. sort.html.erbに遷移してpublicのファルダ以下にある画像データを取得
3. コントローラのcreateにparamsを渡してDBに保存
という流れで実装しようと考えています。
```ruby
 def new
   @product = Product.new
 end
 def sort
   @product = Product.new(product_params)
   products_images = params[:products_images]
   dirname = SecureRandom.hex(20)
   FileUtils.mkdir_p("public/#{dirname}", :mode => 755)
   @img_path_arr = []
   products_images.each do |img|
     name = img.original_filename
     output_path = Rails.root.join("public/#{dirname}", name)
     File.open(output_path, 'wb'){ |f| f.write(img.read) }
     @img_path_arr.push("/#{dirname}/#{name}")
   end
 end
def create
   @product = Product.new(product_params)
   if params[:products_images].present? && params[:products_images].size <= 30
     num = 1
     params[:products_images].each do |img|
       @product.send("products_image#{num}=", img)
       num += 1
     end
   end
   respond_to do |format|
     if @product.save
       format.html { redirect_to [:manage, @product], notice: "#{@product.building_name}を作成しました。" }
       format.json { render :show, status: :created, location: @product }
     else
       format.html { render :pre_sort }
       format.json { render json: @product.errors, status: :unprocessable_entity }
     end
   end
 end
```
```ruby
# sort.html.erb
<%= form_for(@product, url: { action: "create"}, html: { multipart: true }) do |f| %>
   <div class="file-upload-area">
      <% @img_path_arr.each do |path| %>
        <div class="sort-box">
          <input type="text" class="form-control" readonly="" />
          <div style='border: dashed 1px #ccc;'>
            <% f = File.binread(Rails.root.join("public/#{path}")).chomp %>
            <%= hidden_field_tag 'products_images[]', value: f, class: 'uploadFile', style: 'width: 90px; font-size: 16px;' %>
            <div class="imagePreview item" style='padding: 0; background-image: url(<%= path %>)'></div>
          </div>
        </div>
       <% end %>
   </div>
   <%= f.hidden_field :building_name, value: @product.building_name %>
   <%= f.hidden_field :address, value: @product.address %>
 </div>
 <div class="actions">
   <%= button_tag type: 'submit', class: "btn-edit" do %>
     <i class="fa fa-pencil" aria-hidden="true"></i> 作成
   <% end %>
 </div>
<% end %>
```
###問題点
上記のように実装してみたのですが、下から9行目
<%= f.hidden_field :building_name, value: @product.building_name %>
の部分で
undefined method `hidden_field' for #<String:0x007f9600b59ad0>
というエラーが出ます。
###試したこと
・下から9行目のhidden_fieldを削除すると、下から10行目のhidden_fieldで同じエラーがでました。
・どちらも削除すると、コントローラに送信した際に固まってしまいました。
###知りたいこと
public以下の画像ファイルをビューで画像ファイルデータとして取得するにはどうすれば良いのかが知りたいです。
以下の二点が知りたいです。
・ public以下の画像ファイルをビューで画像ファイルデータとして取得する方法
・ こういったイレギュラーなファイル操作をしようとする時に勉強しておくと良い本や学習コンテンツ
ご教示いただけることがあれば何卒よろしくお願いいたします。
  • Ruby on Rails

    14830 questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る