5

私はレールが初めてです。数週間学んでいます。私の愚かさを許してください。アップロードするために選択したファイルを取得できません。

Rails 4.0.0 を使用しています。

私は最初のアプリケーションに取り組んでおり、ブログ アプリケーションのレール ガイドに従うことから始めました。私はそれを取り、それを実行し、ロープを学ぼうとして別のもの (バグ追跡システム) を作成しています。

だから、私は私のフォームを持っています:

<%= form_for @post do |f| %>

file_field に追加しました。ビューからの表示部分は、ファイルの選択に関する限り、見た目も機能も良好です。

<%= f.label :attachment %>
<%= f.file_field :attachment %>

参考までに、これをレール 4 ガイドから引き出しました。したがって、私のコントローラーは次のようになります。

class PostsController < ApplicationController

    def new
      @post = Post.new
    end

    def create
      @post = Post.new(params[:post].permit(:title, :text, :user, :screen))

      if @post.save
        redirect_to posts_path
      else
        render 'new'
      end
    end

    def show
      @post = Post.find(params[:id])
    end

    def index
      @posts = Post.all
    end

    def edit
      @post = Post.find(params[:id])
    end

    def update
      @post = Post.find(params[:id])

      if @post.update(params[:post].permit(:title, :text, :user, :screen))
        redirect_to posts_path
      else
        render 'edit'
      end
    end

    def destroy
      @post = Post.find(params[:id])
      @post.destroy
      redirect_to posts_path
    end

    def upload
      uploaded_io = params[:post][:attachment]
      File.open(Rails.root.join('public', 'uploads', uploaded_io.original_filename), 'w') do |file|
        file.write(uploaded_io.read)
      end
    end

    private
    def post_params
      params.require(:post).permit(:title, :text, :user, :screen, :attachment)
    end

end

ここの新しい作品はアップロードです。他のすべては、データベースからの書き込み/読み取りと表示で正常に機能しています。ビューが表示されたら、テキストを入力し、ファイルを添付して [送信] をクリックします。すべてがデータベースに書き込まれ、インデックスに表示されますが、添付しようとしたファイルが ~/bugs/public/uploads/ に書き込まれません

助けてくれてありがとう。

4

3 に答える 3

4

問題は、「作成」または「更新」アクションで :attachment 属性が許可されたパラメーターではないことにあると思います。

編集: 私が単純なファイルのアップロードを行う方法は、Paperclip gem を使用することです - このrailscastはそれをよく説明しています。使い方はとても簡単です。

質問に答えるかもしれないこの答えもあります。

また、強力なパラメーターを使用する標準的な方法は、プライベート メソッドで許可されたパラメーターを定義し、コントローラー アクションでそのメソッドを呼び出すことです (そのため、同じことを繰り返す必要はありません)。それがエラーの原因かもしれません。

例:

def create
  @post = Post.new(post_params)
  ...
end

それが役立つことを願っています。

于 2013-08-23T16:37:49.203 に答える
2

私は同じ問題を抱えていました、

解決 :-

「def アップロード」を削除し、「def create」自体にコードを追加します。

>  def create
>              
>             uploaded_io = params[:post][:attachment]
>             File.open(Rails.root.join('public', 'uploads', uploaded_io.original_filename), 'w') do |file|
>             file.write(uploaded_io.read)
>             end
> 
>             @post = Post.new(params[:post].permit(:title, :text, :user, :screen))
> 
>             if @post.save
>                     redirect_to posts_path
>             else
>                     render 'new'
>             end
>     end
于 2016-02-09T12:55:32.553 に答える