我是Rails的新手,对于验证参数和返回错误响应有一些疑问。我想使用新的Rails 5 API模式创建一个JSON API。
据我所知,Rails建议使用“强参数”作为验证参数的基准。例如,如果我想创建一个需要电话号码或电子邮件的User类,则可以从UsersController中的类似内容开始。
def create
@user = User.new(create_user_params)
end
def create_user_params
params.require(:user).permit(:email, :phone)
end
Run Code Online (Sandbox Code Playgroud)
现在,如果我想稍微复杂一点,可以添加以下内容
def create
arr_contains_at_least_one(params[:user], [:email, :phone])
@user = User.new(create_user_params)
end
Run Code Online (Sandbox Code Playgroud)
这使我们想到了我的问题。
在默认的Rails错误(ActionController :: ParameterMissing)或自定义错误的情况下,返回“漂亮的”错误响应的最佳方法是什么?我的意思是,如果我在浏览器中调用了API端点,它将返回带有描述性消息的可读JSON。如果我在生产模式下运行服务器,但在第一个示例中未能提供用户参数,rails将返回:
An unhandled lowlevel error occurred. The application logs may have details.
Run Code Online (Sandbox Code Playgroud)
这显然是不好的,特别是如果我希望向最终用户显示错误时。在这里,我假设强参数模式是为了安全性和数据完整性,而不是用户体验。模型字段验证似乎也是如此。因此,我进行了以下调整。
def create
return error_response("some error") unless arr_contains_at_least_one(params[:user], [:email, :phone])
@user = User.new(create_user_params)
end
def error_response(msg, status = 400)
render json: {"code":status, "message": msg}, :status => status
end
Run Code Online (Sandbox Code Playgroud)
这行得通,但是现在我不得不手动编写参数检查(以检查强制性参数的存在,并验证诸如电子邮件地址之类的参数)及其相应的错误响应。如果我也在模型上使用Rails的内置字段验证,这似乎违反了DRY原理。此外,设计好的错误处理模式需要大量的自定义实现。
我错过了一些Rails魔术还是在正确的轨道上?
编辑:看来,活动记录验证可以相当容易地包装在JSON响应中(http://guides.rubyonrails.org/active_record_validations.html),但是对于验证参数的存在仍然存在问题。
我希望能够定义一个 python 函数,该函数执行某种数据结构遍历并在每一步执行一些操作(在回调中定义)。这里有一个简单的例子来说明。
def min_value(list):
m = 0
for i in range(0, len(list)):
if list[i] < m: m = list[i]
return m
Run Code Online (Sandbox Code Playgroud)
这个例子是微不足道的,但如果我正在遍历一个 n 维数组、一个 numpy 数组,或者我想定义一个更复杂的方法来遍历数据结构,就会变得更加复杂。
我正在寻找类似于以下 JavaScript 的“pythonic”类似物,它执行相同的操作。
traverse = function(list, callback) {
for(i = 0; i < list.length; i++) {
callback(list[i])
}
}
min_value = function(list) {
m = 0
traverse(list, function(element) {
if(element < m) m = element
});
}
Run Code Online (Sandbox Code Playgroud)
如果我想要一个函数max_value(list),只需将一行调整为 ,if(element > m) m = element而不必复制/粘贴我的遍历函数会很方便。在 python 中执行此操作的最佳方法是什么?
编辑(答案):在这里,我使用下面接受的答案来展示如何用 python …
我正在尝试使用websockets和Symfony 2创建一个聊天应用程序.给定聊天室的传入消息应该存储在MySQL数据库中,并且应该将传出消息发送给该聊天室的所有注册者.我正在考虑在后端使用这样的东西(使用Symfony 2) https://github.com/GulDmitry/php-websocket-server
这对于前端 http://socket.io/
我认为应该将所有用户添加到某种全局服务器数据结构中,该结构指定在更新聊天室时向谁发送消息.这样的结构在PHP中是否可行?它似乎不会,所以我不确定解决这个问题的最佳方法是什么.
我想为InnoDB MySQL表创建类似MyISAM的行为.我想要一个复合主键:
PRIMARY KEY(id1,id2)
其中id1 auto基于id2的值递增.使用InnoDB实现这一目标的最佳方法是什么?
+----------+-------------+--------------+
| id1 | id2 | other_column |
+----------+-------------+--------------+
| 1 | 1 | Foo |
| 1 | 2 | Bar |
| 1 | 3 | Bam |
| 2 | 1 | Baz |
| 2 | 2 | Zam |
| 3 | 1 | Zoo |
+----------+-------------+--------------+
Run Code Online (Sandbox Code Playgroud) 我有一个与作者表相关的帖子表。这两个表都与第三个表(喜欢)相关,该表指示哪些用户喜欢哪些帖子。我想选择作者和喜欢的帖子,但不知道如何在获取结果后访问连接的对象。我的查询生成器如下所示:
$result = $em->createQueryBuilder()
->select('p')
->from('Post', 'p')
->leftJoin('p.author', 'a')
->leftJoin('p.likes', 'l', 'WITH', 'l.post_id = p.id AND l.user_id = 10')
->where("p.foo = bar")
->addSelect('a AS post_author')
->addSelect('l AS post_liked')
->getQuery()->getResult();
Run Code Online (Sandbox Code Playgroud)
在上面,作者将始终有效,如果请求用户(示例中的用户 10)尚未与帖子进行交互,则 Like 值可能为空。查询工作正常,但我无法访问别名 post_author 或 post_liked 的数据。结果数据如下所示:
[
[0] => Doctrine PostEntity,
[1] => Doctrine PostEntity,
...
]
Run Code Online (Sandbox Code Playgroud)
我想要看起来更像这样的东西:
[
[0] => ['post' => Doctrine PostEntity,
'post_author' => Doctrine UserEntity,
'post_liked' => Doctrine LikeEntity],
[1] => ['post' => Doctrine PostEntity,
'post_author' => Doctrine UserEntity,
'post_liked' => Doctrine LikeEntity],
...
] …Run Code Online (Sandbox Code Playgroud) 我想知道 setter in:const [state, setState] = useState(0)触发组件重新渲染是否是预期的行为。因此,如果我将 setter 作为 prop 传递给组件,它是否应该触发重新渲染,如果是,为什么?有什么办法可以避免这种情况吗?
我创建了一个非常简单的沙箱来演示行为:https : //codesandbox.io/s/bold-maxwell-qj5mi
在这里我们可以看到console.logs,每次单击都会重新渲染按钮组件,而incrementCounter传递给它的函数没有改变。是什么赋予了?
如何将我的AWS RDS实例上的数据库mysqldump转换为.sql文件以供本地使用?
我想使用新的iOS 4.0 SDK在Facebook上明确分享一个开放的图形动作.以下不起作用.它显示在我的活动日志中,但不显示在我的时间轴上.
// Construct an FBSDKSharePhoto
FBSDKSharePhoto *photo = [[FBSDKSharePhoto alloc] init];
photo.image = img;
photo.userGenerated = YES;
// Create an object
NSDictionary *properties = @{
@"og:type": @"theprose:post",
@"og:title": post.title,
@"og:description": post.text,
@"og:caption": @"A fresh picked Prose for you.",
@"og:url": post.url,
@"fb:explicitly_shared": @"true"
};
FBSDKShareOpenGraphObject *object = [FBSDKShareOpenGraphObject objectWithProperties:properties];
// Create an action
FBSDKShareOpenGraphAction *act = [[FBSDKShareOpenGraphAction alloc] init];
act.actionType = @"theprose:share";
[act setObject:object forKey:@"theprose:post"];
[act setPhoto:photo forKey:@"image"];
// Create the content
FBSDKShareOpenGraphContent *content = [[FBSDKShareOpenGraphContent alloc] init];
content.action …Run Code Online (Sandbox Code Playgroud) 我想开发一个新功能,该功能以前会使用钩子包含在一个更高阶的组件中。但是,根据React文档:
“您不能在类组件内部使用Hooks,但是您绝对可以在单个树中将类和函数组件与Hooks混合使用。”
假设我有一些现有的类组件ExistingComponent,希望通过附加功能扩展,例如,监听window.resize。我希望这样做。
// Existing Component
export class ExistingComponent extends React.Component {
render() {
return <div>I exist!</div>;
}
}
// Hook
export const useWindowResize = () => {
function resize() {
console.log('window resized!');
}
useEffect(() => {
window.addEventListener('resize', resize);
return function cleanup() {
window.removeEventListener('resize', resize);
};
});
};
// HOC
export const withWindowResize = component => {
useWindowResize();
return component;
};
// Extended Component
export const BetterComponent = withWindowResize(ExistingComponent);
Run Code Online (Sandbox Code Playgroud)
但是,如果Uncaught Invariant Violation: Hooks …
我正在使用Symfony 2 php框架,它有几个不同的使用环境:开发,生产和测试.app.php前端控制器访问生产环境,app_dev.php前端控制器访问开发环境.任何熟悉Symfony的人都可以建议将开发环境限制为开发人员的最佳方法是什么?我不希望我的网站用户可以查看我的Web应用程序的开发版本,他们应该被限制使用生产环境.
我想重写我的Symfony 2 URL,而不是显示
www.example.com/app.php/path
表明
www.example.com/path
我怎么能用lighttpd做到这一点?
这与这里的上一个问题相关:Doctrine/Symfony query builder add select on left join
我想使用 Doctrine ORM 执行复杂的联接查询。我想选择 10 篇分页博客文章,左侧加入单个作者,例如当前用户的价值以及文章上的主题标签。我的查询生成器如下所示:
$query = $em->createQueryBuilder()
->select('p')
->from('Post', 'p')
->leftJoin('p.author', 'a')
->leftJoin('p.hashtags', 'h')
->leftJoin('p.likes', 'l', 'WITH', 'l.post_id = p.id AND l.user_id = 10')
->where("p.foo = bar")
->addSelect('a AS post_author')
->addSelect('l AS post_liked')
->addSelect('h AS post_hashtags')
->orderBy('p.time', 'DESC')
->setFirstResult(0)
->setMaxResults(10);
// FAILS - because left joined hashtag collection breaks LIMITS
$result = $query->getQuery()->getResult();
// WORKS - but is extremely slow (count($result) shows over 80,000 rows)
$result = new \Doctrine\ORM\Tools\Pagination\Paginator($query, …Run Code Online (Sandbox Code Playgroud) 我已经安装了Symfony2,并且是一个主要工作的站点,唯一的问题是我不知道如何设置默认路由.目前,我使用以下URL访问我的索引和其他路由:
www.example.com/app_dev.php/index
www.example.com/app_dev.php/example_route
我想将www.example.com默认为索引路由,因此我可以使用以下URL获得相同的结果:
www.example.com
www.example.com/example_route
我正在运行lighttpd作为我的Web服务器.如何配置lighttpd/Symfony2来执行此操作?