小编Cap*_*ggz的帖子

Rails JSON API参数验证和错误响应

我是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),但是对于验证参数的存在仍然存在问题。

ruby ruby-on-rails ruby-on-rails-5

6
推荐指数
2
解决办法
7362
查看次数

python中的内联回调函数

我希望能够定义一个 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 …

python arrays callback

6
推荐指数
1
解决办法
4885
查看次数

Symfony 2 websockets

我正在尝试使用websockets和Symfony 2创建一个聊天应用程序.给定聊天室的传入消息应该存储在MySQL数据库中,并且应该将传出消息发送给该聊天室的所有注册者.我正在考虑在后端使用这样的东西(使用Symfony 2) https://github.com/GulDmitry/php-websocket-server

这对于前端 http://socket.io/

我认为应该将所有用户添加到某种全局服务器数据结构中,该结构指定在更新聊天室时向谁发送消息.这样的结构在PHP中是否可行?它似乎不会,所以我不确定解决这个问题的最佳方法是什么.

php websocket symfony

5
推荐指数
1
解决办法
4520
查看次数

自动增量复合键InnoDB

我想为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)

mysql innodb

5
推荐指数
1
解决办法
1658
查看次数

Doctrine/Symfony 查询生成器在左连接上添加选择

我有一个与作者表相关的帖子表。这两个表都与第三个表(喜欢)相关,该表指示哪些用户喜欢哪些帖子。我想选择作者和喜欢的帖子,但不知道如何在获取结果后访问连接的对象。我的查询生成器如下所示:

$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)

php mysql symfony doctrine-orm

5
推荐指数
1
解决办法
1万
查看次数

反应 useState setter 导致重新渲染

我想知道 setter in:const [state, setState] = useState(0)触发组件重新渲染是否是预期的行为。因此,如果我将 setter 作为 prop 传递给组件,它是否应该触发重新渲染,如果是,为什么?有什么办法可以避免这种情况吗?

我创建了一个非常简单的沙箱来演示行为:https : //codesandbox.io/s/bold-maxwell-qj5mi

在这里我们可以看到console.logs,每次单击都会重新渲染按钮组件,而incrementCounter传递给它的函数没有改变。是什么赋予了?

reactjs react-hooks

5
推荐指数
1
解决办法
3332
查看次数

创建Amazon RDS数据库的本地副本

如何将我的AWS RDS实例上的数据库mysqldump转换为.sql文件以供本地使用?

mysql rds amazon-web-services

4
推荐指数
1
解决办法
2298
查看次数

Facebook iOS SDK 4.0上的显式共享

我想使用新的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)

facebook ios facebook-ios-sdk

4
推荐指数
1
解决办法
5257
查看次数

在更高阶的组件中使用钩子

我想开发一个新功能,该功能以前会使用钩子包含在一个更高阶的组件中。但是,根据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 …

reactjs

4
推荐指数
1
解决办法
1510
查看次数

Symfony 2 app.php vs app_dev.php

我正在使用Symfony 2 php框架,它有几个不同的使用环境:开发,生产和测试.app.php前端控制器访问生产环境,app_dev.php前端控制器访问开发环境.任何熟悉Symfony的人都可以建议将开发环境限制为开发人员的最佳方法是什么?我不希望我的网站用户可以查看我的Web应用程序的开发版本,他们应该被限制使用生产环境.

php symfony

3
推荐指数
1
解决办法
1万
查看次数

Mod Rewrite app.php lighttpd

我想重写我的Symfony 2 URL,而不是显示

www.example.com/app.php/path

表明

www.example.com/path

我怎么能用lighttpd做到这一点?

mod-rewrite lighttpd symfony

3
推荐指数
1
解决办法
2371
查看次数

Doctrine Paginator 选择整个表(非常慢)?

这与这里的上一个问题相关: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)

php mysql pagination symfony doctrine-orm

3
推荐指数
1
解决办法
5700
查看次数

在Symfony 2中设置索引路由

我已经安装了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来执行此操作?

indexing routing routes symfony

2
推荐指数
1
解决办法
2万
查看次数