【问题标题】:How do I structure rails 3 controllers and views for ajax based applications如何为基于 ajax 的应用程序构建 rails 3 控制器和视图
【发布时间】:2012-03-06 14:03:39
【问题描述】:

我想知道为基于 ajax 的 Rails 应用程序构建控制器和视图的最佳实践是什么。

例如,如果我有一个由帖子组成的博客,并且我希望能够动态刷新帖子正文,我将如何构建我的应用程序来执行此操作。

从技术上讲,您应该只在控制器中有动词 - 即动作或做词。这意味着执行以下操作将是错误的:

class PostsController < ApplicationController
    #...
    def body
        #return body of a particular post
    end
    #...
end

所以我的另一个想法是将其创建为嵌套资源:

resources :posts do
    resource :body, :controller = "posts/body"
end

然后创建一个帖子/正文子控制器:

class Posts::BodyController < ApplicationController
    def show
        #return body of a particular post
    end
end

这个网址是:

/posts/:post_id/body

在我看来是正确的。

还有其他人有更好的想法吗?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3


    【解决方案1】:

    好问题。我有一个提供 ajax 请求以及常规页面请求的应用程序,我采用了您将 ajax 操作放入资源控制器主体的第一种方法。

    我个人更喜欢这种方法,因为它使控制器易于管理。第二个想法是将其创建为嵌套资源,您最终会拥有许多只执行单个 ajax 操作的控制器。我更喜欢我的高内聚解决方案,其中关于 Posts 的所有内容都在 PostsController 中完成,而不是创建许多单动作子控制器。

    【讨论】:

    • 问题是“博客”并不是真正的动作(在动词意义上),因此打破了对对象执行动作的整个想法。阅读我对@jonnii 的回复。我在 Github 上查看了很多代码,并且许多程序员打破了基于动词的操作的约定。然而,对我来说,它只是感觉有点像 hack,如果你要把东西放在临时的地方,那么它就失去了框架的意义。
    【解决方案2】:

    为什么你只需要身体?你为什么不把整个帖子都退回来,只用正文?

    如果这还不够好,你可以这样做

    def show
      @post = Post.find(params[:id])
    
      # set some etag stuff up so we don't have to request this again if it hasn't changed 
      response.last_modified = @post.created_at.utc
      response.etag = @post
    
      return head :not_modified unless request.fresh?(response)
      respond_to do |wants|
        wants.js { render :json => @post.to_json(:only => params[:select]) }
      end
    end
    

    上面的代码可能存在一些问题。首先,如果find() 返回一个可链接的查询,我不记得了@)。

    我希望这会有所帮助!

    【讨论】:

    • 我给出的博客示例是我在使用 rails 时遇到的(更大的)问题的简化版本。
    • 更大的问题是如何从不同的角度查看同一个对象。例如,如果您收集帖子(默认情况下)您有“索引”操作,现在我如何将该索引视为搜索结果或复选框列表,以便我可以选择我想要进一步处理的帖子.这些用例在 Rails 中没有明显的位置。框架的全部意义在于提供一个结构来放置东西。我认为 Rails 假设模型和控制器之间的相关性太强了。
    • 您的问题听起来更像是“如何设计一个宁静的 api”,而不是特定于 Rails。 Rails 中的模型和控制器之间没有关联,你可以有一个没有模型的控制器和一个没有控制器的模型。
    • 在搜索方面,没有什么可以阻止您:posts/index?search=trololol。然后,您可以在控制器中显示不同的视图以搜索特定的内容,或者您​​可以使用专用的 posts/search 操作。
    • 我同意!不一定需要相关性 - 但我认为 Rails 假设太多会有相关性,并且基于它的太多设计决策。这种相关性之外的任何事情都会变得尴尬。是的;我可以创建应用程序 - 但有时我觉得我在鞭笞一匹死马,而且 Rails 似乎没有什么大的胜利。
    猜你喜欢
    • 2011-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-05
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    • 2011-12-24
    相关资源
    最近更新 更多