簡體   English   中英

Rails API:一個請求,多個控制器操作

[英]Rails API: One Request, Multiple Controller Actions

我有多個在實踐中一起創建和刪除的模型。 基本上,我有一個Article模型和一個Authorship模型。 作者身份將用戶與文章之間的多對多關系聯系起來。 創建文章時,還將創建相應的作者資格。 目前,這是通過多次POST實現的。

但是,僅說我的請求的一部分有效。 例如,我的wifi不好,只有create article請求可以通過。 然后,我的數據處於錯誤創建的狀態,一半處於未創建狀態。

為了解決這個問題,我想一次發送所有數據,然后讓Rails將數據拆分為相應的控制器。 我想到了幾種方法來做到這一點。 第一種方法是讓控制器依次處理每個請求,將它們鏈接在一起。 這將要求控制器調用鏈中的下一個。 但是,這似乎有點僵化,因為如果我決定以其他方式構成控制器,則必須實際修改控制器代碼本身。

第二種方法是先拆分數據,然后用數據的每一位調用控制器動作。 這種方式對我來說似乎更干凈,但是在路由或獨立於控制器的層中都需要一些邏輯。 我不清楚這個邏輯應該去哪里(另一個控制器?路由器?中間件?)

有沒有人有使用任何一種方法的經驗? 有沒有更好的辦法?

謝謝尼古拉斯

通常,您想要做這樣的事情-在對象創建時創建關聯記錄-全部都在同一事務中進行。 我絕對不會考慮分手的創建AuthorshipArticle ,如果創建一個Authorship是自動上Article創作。 你想要的是發生在所有需要的參數,以創建單個請求Article 及其相關Authorship ,那么你在同一個事務中創建兩個。 一種方法是在控制器中執行以下操作:

class Authorship
  belongs_to :user
  belongs_to :article
end

class Article
  has_many :authorships
  has_many :users, through: :authorships
end

class ArticlesController
  def create
    @article = Article.new({title: params[:title], stuff: [:stuff]...})
    @article.authorships.build(article: @article, user_id: params[:user_id])
    if @article.save
      then do stuff...
    end
  end
end

這樣,當您單擊@article.save ,對ArticleAuthorship都是同一事務的一部分。 因此,如果某處發生任何故障,那么整個故障就會發生,並且您最終不會出現流浪/分散/不一致的數據。

如果要在終結點計算機上分配多個作者身份(即,使用多個用戶ID參數),則最后一位可能類似於:

class ArticlesController
  def create
    @article = Article.new({title: params[:title], stuff: [:stuff]...})
    params[:user_ids].each do |id|
      @article.authorships.build(article: @article, user_id: id)
    end

    if @article.save
      then do stuff...
    end
  end
end

您還可以通過虛擬屬性和before_savebefore_create回調將這種關聯的對象創建卸載到模型中,這也將是事務性的。 但是以上習語似乎更典型。

我將在模型中處理一個請求。 如果ArticleAuthor之間具有has_many關系,則可以在Article模型上使用accept_nested_attributes_for 然后,您可以在一個請求中傳遞Authorship屬性以及Article屬性。

我沒有看到您的代碼,但是您可以執行以下操作:

型號/article.rb

class Article < ActiveRecord::Base
   has_many :authors, through: :authorship # you may also need a class_name: param
   accepts_nested_attributes_for: :authors
end

然后,您可以將Author屬性傳遞給Article模型,Rails將根據需要創建/更新Authors

這是有關accepts_nested_attributes_for的不錯的博客文章 您可以在Rails官方文檔中閱讀有關它的信息

我建議您利用嵌套屬性和關聯方法,Rails通過一個控制器操作中的一個Web請求來處理此問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM