使用Rails API和JSON创建用户?

时间:2013-12-02 04:33:15

标签: ruby-on-rails json api ruby-on-rails-4

所以我在Rails中测试了一个非常简单的API,看看我是否可以使用Chrome插件Postman(REST客户端扩展)在本地创建用户。

在我的rails应用程序中,我为我的API设置了一个文件夹/命名空间,每当我尝试创建用户时,都会收到以下错误: 缺少模板api / v1 / users / create,application / create with {:locale => [:en],:formats => [:json],:handlers => [:erb,:builder,:raw, :ruby,:jbuilder,:coffee]}。搜索:*" PATH / app / views"

我使用的是Rails 4.0.1和Ruby 2.0

我在帖子下面张贴了我发布的内容:

Screenshot 1

module Api
     module V1
    class UsersController < ApplicationController
        class User < ::User
            # add any hacks
        end

        respond_to :json

        def index
            respond_with User.all
        end

        def show
            respond_with User.find(params[:id])
        end

        def new
            @user = User.new
        end

        def create
            @user = User.create(user_params)
            # respond_with(@user)

            if @user.save
                # render json: @user, status: :created, location: @user
                redirect_to @user
            end
        end

        private

            def user_params
              params.require(:user).permit(:name, :age, :location) if params[:user]
            end
    end
  end
end

基于我的user_params,我应该能够创建一个新用户,对吗? 如果您需要任何其他信息,请告诉我,我会尽快回复! 谢谢!

2 个答案:

答案 0 :(得分:22)

您可以使用API​​创建用户。

1)首先,您需要在您的routes.rb中放置适当的资源:

YourApp::Application.routes.draw do
  namespace :api do
    namespace :v1 do
     resources :users
    end
    namespace :v2 do
    # ... if needed
    end
  end

  root to: 'users#index'
end

2)您需要创建一个RESTfull风格的控制器来处理请求。这里可以实现您的“创建”操作。

def create
  respond_with User.create(fio: params[:fio], phone: params[:phone], region: params[:region], updated_at: Time.now)
end

带有respond_to的'create'示例:

def create
    # ...
    respond_to do |format|
      format.html {render text: "Your data was sucessfully loaded. Thanks"}
      format.json { 
                   User.create(... params ...)
                   render text: User.last.to_json  # !
                  }
    end
  end

如果您需要特别的回复,请参阅有关respond_withrespond_to的文档。

也可以提供关于API构建的有用的railscasts剧集:#350#352

P.S。 folder / namespace / v1 / users_controller 应与模块Api中的类名相同

P.S.2您可以观察我的应用,在那里您可以找到有用的东西(与您的应用相同 - 创建记录的简单API) - myApp

users_controller示例(controllers / api / v1 / users_controller.rb):

#encoding: utf-8

    module Api
      module V1
        class UsersController < ApplicationController # Api::BaseController
          before_filter :authenticate_user!, except: [:create, :index]

          respond_to :json

          def index
        #respond_with

            respond_to do |format|
              format.html {render text: "Your data was sucessfully loaded. Thanks"}
              format.json { render text: User.last.to_json }
            end
          end

          def show
            respond_with User.find(params[:id])
          end

          def create
            respond_with User.create(access_token: params[:access_token], city: params[:city], created_at: Time.now, phone: params[:phone], region: params[:region], updated_at: Time.now)
          end

          def update
            respond_with User.update(params[:id], params[:users])
          end

          def destroy
            respond_with User.destroy(params[:id])
          end
        end
      end
    end

答案 1 :(得分:0)

redirect不会返回,因此您的create方法会继续寻找要渲染的模板,然后找不到匹配的模板。

要修复,您需要明确返回redirect

 if @user.save
   return redirect_to(@user)
 end

您还需要注意@user的默认网址。在这种情况下,明确指定命名路径更好,比如说redirect_to(user_path(@user))