Rails:为什么POST请求提交到主URL(/ users)?

时间:2017-11-23 05:23:58

标签: ruby-on-rails ruby rest

我在Michael Hartl的Rails Tutorial的第二章。

当我这样做时:

rails generate scaffold User name:string email:string

这就是我users_controller.rb的样子:

  # GET /users
  # GET /users.json
  def index
    @users = User.all
  end

  # GET /users/1
  # GET /users/1.json
  def show
  end

  # GET /users/new
  def new
    @user = User.new
  end

  # GET /users/1/edit
  def edit
  end

  # POST /users
  # POST /users.json
  def create
    @user = User.new(user_params)

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

  # PATCH/PUT /users/1
  # PATCH/PUT /users/1.json
  def update
    respond_to do |format|
      if @user.update(user_params)
        format.html { redirect_to @user, notice: 'User was successfully updated.' }
        format.json { render :show, status: :ok, location: @user }
      else
        format.html { render :edit }
        format.json { render json: @user.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /users/1
  # DELETE /users/1.json
  def destroy
    @user.destroy
    respond_to do |format|
      format.html { redirect_to users_url, notice: 'User was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

当我转到http://localhost:3000/users/new时,我会看到一个添加新用户的页面,但当我检查新用户的请求提交的位置时,确定已将其发布到/usersenter image description here

为什么新用户提交到/users而不是/users/new?这是某种惯例吗?我创建了另一个脚手架,它的行为方式相同。我之前和Flask一起工作过,并且我将POST请求代码添加到接受我的GET请求的相同方法/函数中。为什么这不是这种情况?无法Rails只是将我的新用户POST请求发送到/users/new?为什么/users特别是URI?这让我很困惑。任何链接都很棒。谢谢!

快速修改:我错过了添加的内容。这是因为我不应该将这些URI视为URI,而是我提交给某种抽象实体。例如,当我添加新用户时,添加到用户(/users),实体会比添加到/users/new更有意义吗?如果我使用这个逻辑,提交到/users/id的PUT方法更有意义,因为我提交给现有的用户实体而不是URI。

2 个答案:

答案 0 :(得分:2)

是的,这是一个惯例。

您可能想了解Representational State Transfer (REST) - 尤其是有关relationship between URL and HTTP methods的部分。

答案 1 :(得分:0)

从终端运行rake routes,您将看到该应用的所有路线。

以下是用户的路线:

HTTP Verb   Path            Controller#Action
GET         /users              users#index
GET         /users/new          users#new
POST        /users              users#create
GET         /users/:id          users#show
GET         /users/:id/edit     users#edit
PATCH/PUT   /users/:id          users#update
DELETE      /users/:id          users#destroy

/users/new通过UsersController操作调用new并获取new.html.erb,其中包含POST请求和操作/users的表单。

表单提交后,' UsersController'调用create动作,创建新用户。

所以,

GET /users/new =>它是一个get请求,显示一个带有表单的页面

POST /users =>它是一个创建用户的帖子请求。

有关rails路由的详细信息,请查看链接http://guides.rubyonrails.org/routing.html