【问题标题】:Create a rails controller which will update multiple tables in db创建一个 Rails 控制器,它将更新 db 中的多个表
【发布时间】:2014-10-07 07:24:12
【问题描述】:

我是 Rails 新手。 我可以创建一个控制器来获取 json 数据并更新数据库中的多个表吗?这个控制器不会做任何事情。

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

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

app/controllers/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)

【问题讨论】:

  • 您的网址不一致,/data 和 /submit_result。我认为这是您帖子中的错误,因为错误消息表明您选择了正确的路线。

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


【解决方案1】:

你需要在你的 config/routes.rb 中为它创建一个路由。

如果您只有该操作,则定义将类似于

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

only: [] => 这使得默认的 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 "localhost:3000/data/submit", {u​​ser: {name: 'John'}, 角色: {name: 'admins'} }.to_json, {:content_type => :json}

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

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

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

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

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

【讨论】:

  • 嗨,费尔,根据我的理解,资源意味着它在数据库中的某个表。 data 不是一个表,它是一个包含用于更新多个表的条目的 json 数据。
  • routes.rb 仅定义您的 url 与为特定 url 调用的控制器/动作之间的映射。模型是那些在数据库中具有关联表的模型。
  • 您好,在对路由和控制器进行更改后,我收到错误“ActionController::RoutingError (No route matches [POST] "/data/submit"):"
  • 看看我给你写的例子。您应该将请求发送到“localhost:3000/data/submit”,或者将路由更改为 submit_result 并将您的控制器方法重命名为 submit_result
  • 当我添加资源时:data, only[] post '/data/submit' => 'data#submit' 它给出错误 ActionController::RoutingError (uninitialized constant DataController)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-14
相关资源
最近更新 更多