当前位置: 首页 > 知识库问答 >
问题:

Rails CRUD路由和控制器方法最佳实践

陆洛城
2023-03-14

CRUD代表创建,读取,更新,删除。这是四种html" target="_blank">方法(如果区分查看一个记录和查看所有记录,则是五种方法)。在Rails中,处理CRUD的规范方法似乎包括七种方法。例如,使用 速记法为Order对象创建路由会生成以下七条路由:

这就是我困惑的根源。为 设置单独的操作/路由有什么意义?使用单独的操作查看页面和在数据库中创建记录有什么好处?我理解它是如何在Rails中实现的,例如:

class OrdersController < ApplicationController
  def new
    @order = Order.new
    render
  end

  def create
    @order = Order.new(order_params)
    if @order.save
      redirect_to @order, notice: 'Successfully created an order.'
    else
      render :new
    end
  end
end

在使用Rails之前,我使用了Yii(PHP),它有一个内置的CRUD生成器,生成如下代码(翻译成Rails:

class OrdersController < ApplicationController

  def create

    if request.method == "POST"
      @order = Order.new(order_params)
      if @order.save
        redirct_to @order, notice: 'Successfully created an order.'
      end
    else
      @order = Order.new
    end

    render 

  end
end

我喜欢这种模式的原因是因为它避免了为不同的控制器操作呈现模板。在第一个代码示例中,用户转到 ,并发布到 。如果验证失败,用户仍然停留在 ,但是查看 的模板。这可能会使用户感到困惑,而且它似乎也挫败了在数据库中查看页面和创建记录时使用单独操作的整个想法。如果您重定向到 而不是使用 ,则会丢失所有验证错误消息。

我发现自己下意识地滑回了Rails代码中的Yii方式。谁能解释为什么标准的方式是有利的?如果我偏离了规范的Rails模式,我会遇到什么问题吗?

StackOverflow是在警告我,这个问题是主观的,很可能被关闭,所以让我来澄清一下。我并不是要讨论Rails vs.Yii,也不是要确定组织CRUD代码的最佳理论方法。我想知道如果我偏离了规范的Rails处理CRUD的方式,是否有任何关于Rails的东西会断裂。

共有1个答案

谢承颜
2023-03-14

简单的解释就是:

因为这是上帝和DHH的意图。

Rails CRUD约定非常实用,允许您避免与浏览器缓存和安全性相关的许多陷阱。

让我们举一个例子:

# config/routes.rb
resources :users, only: [:new, :create]

# app/controllers/users_controller.rb
class UsersController < ApplicationController
  def new
    @user = User.new
  end

  def create
    @user = User.new(user_params)

    if @user.save
      sign_in(@user)
      redirect_to root_path
    else
      render :new
    end
  end

  private 
    def user_params
      params.require(:user).permit(:email, :password, :password_confirmation)
    end
end

这里我们有两个单独的路由

第一条路由是幂等的--它对于任何访问者看起来都应该是一样的,并且可以缓存。第二个不是--它应该显示创建或试图创建资源的结果。

当用户访问时,我们将表单发布到不同的URI。这就避免了客户端中的历史记录问题。

如果输入无效,我们也会在相同的请求周期中呈现表单。这避免了在重定向中将表单数据传递回时可能出现的安全问题,并让我们返回语义正确的响应代码,而不是重定向。

它还确保我们的应用程序在restful意义上是无状态的,因为如果我们访问,前面的操作不会影响我们看到的内容。

在体系结构级别上,它允许您利用约定而不是配置。你可以这样做:

def new
  @user = User.new
end

并且它将呈现 ,因为Rails可以派生出新动作应该呈现新模板。从设计和测试的角度来看,让每个控制器操作执行一个单独的任务要好得多,因为它消除了在同一方法中测试两个单独的代码路径的需要。

 类似资料:
  • 我有什么可用的选择来使用GWT来实现这一点?

  • 假设我有这条路线 第一个示例将调用中的函数,但第二个示例我不知道将函数放在哪里,无论是在还是中,我是否应该将第二个示例放在中?还是在销毁功能中显示DiscountController?哪一种是最佳实践?

  • 我想从spring控制器返回一个字符串(json字符串)作为它接收到的AJAX调用的响应,响应可能会根据我是否提交了@Valid表单而有所不同。这就是我处理它的方式,我想知道这是否被认为是最佳实践?请注意,我使用的是@RestController,所以@ResonseBody应用所有方法。

  • 英文原文: http://emberjs.com/guides/routing/setting-up-a-controller/ URL的改变同时也可能改变显示的模板。而模板只有当其搭载了需要呈现的信息才有用。 在Ember.js中,模板从控制器中获取需要呈现的信息。 内置的两个控制器Ember.ObjectController和Ember.ArrayController,使控制器可以非常方便的呈

  • 本文向大家介绍Laravel框架路由和控制器的绑定操作方法,包括了Laravel框架路由和控制器的绑定操作方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Laravel框架路由和控制器的绑定操作方法。分享给大家供大家参考,具体如下: 路由和控制器的关系 路由文件地址在\app\Http\routes.php,我们来看两种不同的路由。 以上均为绑定匿名函数的路由,虽然可以返回视图,也可以

  • 问题内容: 这是一个现实的Angular问题,我无法解决。我喜欢Angular,但是这个问题现在困扰着我很多。 扩展现有控制器功能,并在应用程序的另一页上使用扩展控制器的最佳实践是什么?换句话说: 如何在Angular中继承控制器? 编辑 -2014年9月23日,不要以为我的原始用例的描述会帮助访问者更好地理解我在这里的用意。我认为这使人们偏离了真正的问题。 问题答案: 半年后,我想我完全了解发生