创建一个rails控制器,它将更新db中的多个表

时间:2014-10-07 07:24:13

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

我是铁杆新手。 我可以创建一个控制器,它将获取json数据并更新db中的多个表吗?这个控制器会在视野中发挥作用。

我正在做以下事情: - 的 routes.rb中:

post '/data' => 'data#submit'

应用/控制器/ data_controller.rb:

    class DataController < ApplicationController
       def submit
         data = JSON.parse request.body.read
         puts data
       end
    end

然后发送帖子请求

    RestClient.post "localhost:3000/submit_result", data.to_json, {:content_type => :json}

但这是错误的错误

ActionController::RoutingError (uninitialized constant DataController)

1 个答案:

答案 0 :(得分:1)

您需要在config / routes.rb中为它创建路由。

如果您只有这个动作,那么定义将类似于

resource :data, only: [] do
  post :submit
end

only: [] =&gt;这使得默认的CRUD操作没有被创建。

然后在您的控制器中,您可以执行以下操作:

class DataController < ApplicationController
   def submit
     data = JSON.parse params[:some_key]
     puts data
     render nothing: true # this will avoid view rendering
   end
end

你的休息客户应该这样打电话:

RestClient.post "localhost:3000/data/submit", data.to_json, {:content_type => :json}

关于是否可以从该控制器更新多个表:是的,可以。

假设您使用以下格式发送数据:

RestClient.post&#34; localhost:3000 / data / submit&#34;,{user:{name:&#39; John&#39;},角色:{name:&#39; admins&#39; } .to_json,{:content_type =&gt; :JSON}

然后,在您的控制器中,您可以根据收到的参数创建用户和角色:

class DataController < ApplicationController
   def submit
     User.create params[:user]
     Role.create params[:role]
     render nothing: true # this will avoid view rendering
   end
end

无论如何,这可能会使控制器的代码很快变得复杂。最好的方法是创建一个接收params的新类并创建你需要的东西。

class DataController < ApplicationController
   def submit
     MassDataCreator.create(params)
     render nothing: true # this will avoid view rendering
   end
end

这样做的好处是控制器代码看起来更清晰,您可以为创建数据的新类编写单元测试(通过单元测试,通过单元测试,单个测试总是更容易集成测试)