gpt4 book ai didi

ruby-on-rails - Ruby on Rails Controller 设计

转载 作者:行者123 更新时间:2023-12-04 05:08:32 24 4
gpt4 key购买 nike

当我查看 Rails Controller 的示例时,我通常会看到如下内容:

class WidgetController < ActionController::Base

def new
@widget = Widget.new
end

def create
@widget = Widget.new(params[:id])
if @widget.save
redirect_to @widget
else
render 'new'
end
end
end

这有效,但有几个问题:

路线

如果我将小部件添加到我的 routes.rb 文件:
Example::Application.routes.draw do
resources :widgets
end
GET /widgets/new将路由到 newPOST /widgets将路由到 create .

如果用户在新的小部件页面上输入错误信息并提交,他们的浏览器将显示一个带有 /widgets 的 URL。 ,但将呈现新模板。如果用户为页面添加书签并稍后返回或刷新页面,则将调用索引操作而不是新操作,这不是用户所期望的。如果没有索引操作或者用户没有查看它的权限,响应将是 404。

代码重复

作为一个人为的例子,假设我的新方法中有一些棘手的逻辑:
def new
@widget = Widget.new
do_something_tricky()
end

使用当前的方法,我会在 new 中复制该逻辑和 create .我可以打电话 new来自 create ,但随后我必须修改 new检查是否 @widget定义为:
def new
@widget ||= Widget.new
do_something_tricky()
end

另外,这感觉是错误的,因为它降低了 Controller Action 的正交性。

怎么办?

那么 Rails 解决这个问题的方法是什么?我应该重定向到 new而不是渲染新模板?我应该打电话 new内部 create ?我应该忍受它吗?有更好的方法吗?

最佳答案

我不认为这是“rails 方式”中的问题,并且没有内置功能可以在不弄脏手的情况下允许这样做。用户在为他们刚刚提交并出现错误的表单添加书签时期望什么?用户不知道更好,他们不应该为失败的表单添加书签。

我想重定向到 new_widget_path是最干净的解决方案。但是,您应该保留错误并将它们显示在表单上。为此,我建议您将参数保留在 session 中(我希望它比序列化的 Widget 对象小)。

def new
@widget = widget_from_session || Widget.new
end

def widget_from_session
Widget.new(session.delete(:widget_params)) if session[:widget_params].present?
end
private :widget_from_session

# Before the redirect
session[:widget_params] = params

代码不言自明, Widget.new只会在 widget_from_session 时被调用返回 nil,这是 session[:widget_params] 存在的时候。调用 delete在散列上将返回删除的值并将其从原始散列中删除。

更新 选项 2
使用ajax提交表单怎么样?您的 Controller 可以受益于:
  respond_to :html, :json

...

def create
@widget = Widget.new params[:widget]
@widget
respond_with @widget, location: nil
end

根据响应代码(由 Rails 设置:201 Created 或 422 Unprocessable Entity),您可以显示错误(验证失败时在响应正文中可用)或将用户重定向到 @widget

StackOverflow 就是这样做的: https://stackoverflow.com/questions/ask .他们异步提交表单。

关于ruby-on-rails - Ruby on Rails Controller 设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15193081/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com