1

$.ajax を使用して jquery を介して単純なレール足場プロジェクトにデータを投稿する方法を学習しようとしています。標準的な scaffold で作成されたコントローラーが 1 つある => 画像

class ImagesController < ApplicationController
  # GET /images
  # GET /images.json
  def index
    @images = Image.all

    respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @images }
    end
  end

  # GET /images/1
  # GET /images/1.json 
  def show
    @image = Image.find(params[:id])

    respond_to do |format|
      format.html # show.html.erb
      format.json { render json: @image }
    end
  end

  # GET /images/new
  # GET /images/new.json
  def new
    @image = Image.new

    respond_to do |format|
      format.html # new.html.erb
      format.json { render json: @image }
    end
  end

  # GET /images/1/edit
  def edit
    @image = Image.find(params[:id])
  end

  # POST /images
  # POST /images.json
  def create
    @image = Image.new(params[:image])

    respond_to do |format|
      if @image.save
        format.html { redirect_to @image, notice: 'Image was successfully created.' }
        format.json { render json: @image, status: :created, location: @image }
      else
        format.html { render action: "new" }
        format.json { render json: @image.errors, status: :unprocessable_entity }
      end
    end
  end

  # PUT /images/1
  # PUT /images/1.json
  def update
    @image = Image.find(params[:id])

    respond_to do |format|
      if @image.update_attributes(params[:image])
        format.html { redirect_to @image, notice: 'Image was successfully updated.' }
        format.json { head :no_content }
      else
        format.html { render action: "edit" }
        format.json { render json: @image.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /images/1
  # DELETE /images/1.json
  def destroy
    @image = Image.find(params[:id])
    @image.destroy

    respond_to do |format|
      format.html { redirect_to images_url }
      format.json { head :no_content }
    end
  end
end

1 つのルート => リソース :images で。データベース スキーマは、1 つのフィールド => t.string :name で構成されます。私の最初のテストhtmlファイルは次のとおりです。

<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js">    </script>
</head>
<body>
    <script>
    $(document).ready(function(){
        $.ajax({
            type: 'POST', url: "localhost:3000/images",
            data: { name: "johngalt" }
        });
    });
    </script>
</body>

webrick の結果は次のとおりです。

Started POST "/images" for 127.0.0.1 at 2012-04-17 09:50:19 -0500
Processing by ImagesController#create as */*
  Parameters: {"name"=>"johngalt"}
WARNING: Can't verify CSRF token authenticity
   (0.1ms)  begin transaction
   SQL (63.5ms)  INSERT INTO "images" ("created_at", "name", "updated_at") VALUES (?, ?,  ?)  [["created_at", Tue, 17 Apr 2012 14:50:21 UTC +00:00], ["name", nil], ["updated_at",  Tue, 17 Apr 2012 14:50:21 UTC +00:00]]
   (2.0ms)  commit transaction
 Redirected to http://localhost:3000/images/7
 Completed 302 Found in 81ms (ActiveRecord: 65.6ms)

名前に「johngalt」が含まれていない理由がわかりません。これは「警告: CSRF トークンの信頼性を確認できません」と関係がありますか?

編集 curlを使用する場合:

curl -d "image[name]=johngalt"  localhost:3000/images.json

レコードが作成され、名前フィールドに「johngalt」が含まれます。要するに、curl でできることと同等の .ajax を理解しようとしているのですか?

4

1 に答える 1

0

CSRF トークンは、Rails ヘルパーを使用してフォームを作成すると、投稿フォームに自動的に追加され、クロスサイト リクエスト フォージェリ攻撃form_forからユーザーを保護することを目的としています。そのため、JavaScript ファイルに投稿しようとすると、トークンにアクセスできなくなります。

結果を理解している限り、必要に応じて特定のアクションの CSRF トークン認証を無効にすることができます。

ここにリストされているいくつかの方法があります: Rails 3 で CSRF トークンをオフにする

編集CURL の例を見ると、間違ったデータを ajax で投稿しているようです。「image」パラメーター名前空間を省略しています。試す:

<script>
$(document).ready(function(){
    $.ajax({
        type: 'POST', url: "localhost:3000/images",
        data: { image: { name: "johngalt" } }
    });
});
</script>
于 2012-04-17T15:02:45.290 に答える