我们已经部署了Wordpress实例并安装了JSON API插件
使用此插件,您可以进行简单的HTTP GET请求,例如:
http://www.example.org/?json=get_recent_posts
http://www.example.org/?json=get_post&post_id=47
http://www.example.org/?json=get_tag_posts&tag_slug=banana
Run Code Online (Sandbox Code Playgroud)
并在JSON中回复:
{
"status": "ok",
"count": 1,
"count_total": 1,
"pages": 1,
"posts": [
{...}}
Run Code Online (Sandbox Code Playgroud)
我的问题是我应该如何在我的Rails应用程序中进行这些类型的请求(然后解析返回的JSON).我刚开始只是从头开始写东西,但我想有一些好的现有工具来管理这样的东西.基本上,当Ruby-wrapper尚未可用时,我从未尝试过连接到API.你能帮助一个菜鸟如何开始?
我有一个Group资源,我正在尝试使用适当的授权进行设置.
我试图实现的授权逻辑是这样的:
我正在尝试使用组控制器中的以下before_filter语句执行此操作:
before_filter :signed_in_user
before_filter :correct_user, only: :show
before_filter :admin_user, only: [:show, :index, :edit, :update, :destroy]
Run Code Online (Sandbox Code Playgroud)
Correct_user工作,因为我已经验证只有组成员可以查看他们的组.但是,我想要发生的是使用admin:show子句来覆盖它,以便管理员可以查看任何组.目前这是行不通的.我猜我的滤镜排序和选项有问题.
谁能告诉我哪里出错了?
编辑
根据Amar的请求添加我的方法代码:
private
def correct_user
# User has to be a member to view
@group = Group.find(params[:id])
redirect_to(root_path) if @group.members.find_by_member_id(current_user).nil?
end
def admin_user
redirect_to(root_path) unless current_user.admin?
end
Run Code Online (Sandbox Code Playgroud) authorization ruby-on-rails before-filter role-base-authorization
我真的很难过这一点,所以如果有人能提供线索,我真的很感激。
这是我的网站(内置导轨):http : //floating-autumn-3174.herokuapp.com/
当有人试图通过 Facebook 或 Twitter 上的链接访问该网站时,基本上会加载一个新标签,但随后会立即关闭。这只发生在 Chrome 中。在 Firefox 中工作得很好。
如果我右键单击该链接,然后选择“在新选项卡中打开”,则加载正常。
如果我右键单击并复制链接,它就可以正常工作。
我认为这可能与 SSL 重定向有关,但我使用我的登台环境(无 SSL)进行了测试,它运行良好。
所以基本上这种自动关闭只发生在 Chrome 和点击加载新标签的链接时。
任何线索发生了什么或我如何才能更好地解决这个问题?
编辑
好的,在查看了我们包含的 javascript 之后,我相信我已经找到了问题所在。它涉及一些我们用来处理弹出窗口的 JS。首先让我解释一下我们正在尝试做什么。我们通过 Facebook 进行身份验证。当用户单击“通过 Facebook 登录”时,将启动一个弹出窗口并进行身份验证。成功后,弹出窗口关闭,主窗口以登录状态刷新。这一切正常,但我意识到弹出窗口关闭代码正在杀死所有其他新窗口。这是下面的完整代码片段:
function popupCenter(url, width, height, name) {
var left = (screen.width/2)-(width/2);
var top = (screen.height/2)-(height/2);
return window.open(url, name, "menubar=no,toolbar=no,status=no,width="+width+",height="+height+",toolbar=no,left="+left+",top="+top);
}
$(document).ready(function(){
$("a.popup").click(function(e) {
popupCenter($(this).attr("href"), $(this).attr("data-width"), $(this).attr("data-height"), "authPopup");
e.stopPropagation(); return false;
});
if(window.opener) {
window.opener.location.reload(true);
window.close()
}
});
Run Code Online (Sandbox Code Playgroud)
最后一个 if 语句是我认为导致问题的原因。我是一个严肃的 JS 菜鸟,所以我不知道如何解决这个问题。基本上,如果链接用于弹出窗口,我只希望最后一个条件触发。我怎么能这样做呢?再次感谢所有的帮助。
编辑 2
我继续下面 Rob 的回答,并认为它有效,但实际上遇到了一个我希望得到帮助的边缘情况。显然,当用户第一次通过 Facebook …
我有一个Channel带有dateOn类型列的GraphQL 表AWSDateTime
在我的 React 应用程序中,我调用了一个 mutation 来创建一个新的Channel. 这是相关的代码:
const createChannel = `
mutation createChannel {
createChannel(input:{
title:"${title}"
dateOn:${Date.now()}
slug: "${slug}"
authorId: "${authorId}"
}) {
id title slug authorId
}
}
`;
Run Code Online (Sandbox Code Playgroud)
AWS 接受以下格式的日期时间字符串:
The AWSDateTime scalar type represents a valid extended ISO 8601 DateTime string. In other words, this scalar type accepts datetime strings of the form YYYY-MM-DDThh:mm:ss.sssZ
我将如何在 Javascript 中以这种格式传递当前时间?
我有一个类似于你在这篇帖子底部看到的数组(具体来说,它是从fb_graph返回的fb朋友列表).
如果我想通过这个哈希并从每个记录中选择'identifier'属性,我知道我可以这样做:
@fb_friends.map &:identifier # returns ["123", "134",...]
Run Code Online (Sandbox Code Playgroud)
我的问题是如果我想从每条记录中挑选出多个属性.基本上我想抓住标识符,名称和图片.天真我想做点什么:
@fb_friends.map &:identifier, :name, :picture
Run Code Online (Sandbox Code Playgroud)
但当然这不起作用.知道如何解决这个问题吗?
[#<FbGraph::User:0x007f9ec1fd63c8 @identifier="1868", @endpoint="https://graph.facebook.com /----", @access_token="AAAFGzU8vU0gBAEK2q3WYEUJNZAczuO6UPOLqbscwvZALr1gW1ePBqpyarh0uTv6alA2YyNvIzZBcvvIBEYy4i5ulMJZCpWcZD", @cached_collections={}, @name="REMOVED", @first_name=nil, @middle_name=nil, @last_name=nil, @gender=nil, @locale=nil, @languages=[], @link=nil, @username=nil, @third_party_id=nil, @timezone=nil, @verified=nil, @about=nil, @bio=nil, @education=[], @email=nil, @interested_in=[], @political=nil, @favorite_teams=[], @quotes=nil, @relationship_status=nil, @religion=nil, @relationship=nil, @website=nil, @work=[], @sports=[], @favorite_athletes=[], @inspirational_people=[], @mobile_phone=nil, @installed=nil>, #<FbGraph::User:0x007f9ec1fda9f0 @identifier="3??1", @endpoint="https://graph.facebook.com/----", @access_token="AAAFGzU8vU0gBAEK2q3WYEUJNZAczuO6UPOLqbscwvZALr1gW1ePBqpyarh0uTv6alA2YyNvIzZBcvvIBEYy4i5ulMJZCpWcZD", @cached_collections={}, @name="Removed", @first_name=nil, @middle_name=nil, @last_name=nil, @gender=nil, @locale=nil, @languages=[], @link=nil, @username=nil, @third_party_id=nil, @timezone=nil, @verified=nil, @about=nil, @bio=nil, @education=[], @email=nil, @interested_in=[], @political=nil, @favorite_teams=[], @quotes=nil, @relationship_status=nil, @religion=nil, @relationship=nil, @website=nil, @work=[], …Run Code Online (Sandbox Code Playgroud) 我正在构建一个iPhone应用程序的Rails后端.
在分析我的应用程序之后,我发现以下调用在性能方面特别昂贵:
@messages.as_json
Run Code Online (Sandbox Code Playgroud)
此调用返回大约30个消息对象,每个消息对象包含许多子记录.如您所见,单个消息json响应可能会组成许多DB调用:
def as_json(options={})
super(:only => [...],
:include => {
:user => {...},
:checkin => {...}
}},
:likes => {:only => [...],
:include => { :user => {...] }}},
:comments => {:only => [...],
:include => { :user => {:only => [...] }}}
},
:methods => :top_highlight)
end
Run Code Online (Sandbox Code Playgroud)
平均来说,@messages.as_json呼叫(所有30个对象)需要近1100毫秒.
想要优化我已经使用了memcached.使用下面的解决方案,当我的所有消息对象都在缓存中时,平均响应现在是200-300ms.我对此很满意,但我遇到的问题是,这使缓存未命中的情况更加缓慢.如果缓存中没有任何内容,则现在需要超过2000毫秒进行计算.
# Note: @messages has the 30 message objects in it, but none of the child records have been grabbed
@messages.each_with_index do |m, i|
@messages[i] = Rails.cache.fetch("message/#{m.id}/#{m.updated_at.to_i}") …Run Code Online (Sandbox Code Playgroud) 我在javascript中发出HTTP POST/DELETE请求以删除我的rails应用中的消息
$.post(message_url, { _method: 'delete' }, null, "script");
Run Code Online (Sandbox Code Playgroud)
如果我在执行此行后在页面上刷新浏览器,则会看到该消息实际上已被删除且不再显示.
现在我希望页面在此命令后自动刷新,以便用户看到它消失了.我有以下几行:
$.post(message_url, { _method: 'delete' }, null, "script");
window.location.reload();
Run Code Online (Sandbox Code Playgroud)
现在页面确实刷新了但消息不再被删除.我在控制台中没有看到任何错误.
所以基本上没有这个reload(); 命令消息删除就好了,但是如果我添加这个reload()行就会停止工作.为什么会这样?
更重要的是,我怎么能完成我想要做的事情?
我添加gem 'redis'到我的Gemfile中.跑bundle install.重新启动本地服务器,然后仅在我的控制台中运行hello world示例以获取错误.知道什么是错的吗?
[kudo (develop)]$ rails console
Loading development environment (Rails 3.2.3)
1.9.3p125 :001 > redis = Redis.new
=> #<Redis client v3.0.2 for redis://127.0.0.1:6379/0>
1.9.3p125 :002 > redis.set("mykey", "hello world")
Redis::CannotConnectError: Error connecting to Redis on 127.0.0.1:6379 (ECONNREFUSED)
from /Users/pejman/.rvm/gems/ruby-1.9.3-p125@rails3tutorial2ndEd/gems/redis-3.0.2/lib/redis/client.rb:268:in `rescue in establish_connection'
from /Users/pejman/.rvm/gems/ruby-1.9.3-p125@rails3tutorial2ndEd/gems/redis-3.0.2/lib/redis/client.rb:263:in `establish_connection'
from /Users/pejman/.rvm/gems/ruby-1.9.3-p125@rails3tutorial2ndEd/gems/redis-3.0.2/lib/redis/client.rb:69:in `connect'
from /Users/pejman/.rvm/gems/ruby-1.9.3-p125@rails3tutorial2ndEd/gems/redis-3.0.2/lib/redis/client.rb:282:in `ensure_connected'
from /Users/pejman/.rvm/gems/ruby-1.9.3-p125@rails3tutorial2ndEd/gems/redis-3.0.2/lib/redis/client.rb:173:in `block in process'
from /Users/pejman/.rvm/gems/ruby-1.9.3-p125@rails3tutorial2ndEd/gems/redis-3.0.2/lib/redis/client.rb:248:in `logging'
from /Users/pejman/.rvm/gems/ruby-1.9.3-p125@rails3tutorial2ndEd/gems/redis-3.0.2/lib/redis/client.rb:172:in `process'
from /Users/pejman/.rvm/gems/ruby-1.9.3-p125@rails3tutorial2ndEd/gems/redis-3.0.2/lib/redis/client.rb:84:in `call'
from /Users/pejman/.rvm/gems/ruby-1.9.3-p125@rails3tutorial2ndEd/gems/redis-3.0.2/lib/redis.rb:608:in `block in set'
from /Users/pejman/.rvm/gems/ruby-1.9.3-p125@rails3tutorial2ndEd/gems/redis-3.0.2/lib/redis.rb:36:in `block in …Run Code Online (Sandbox Code Playgroud) 根据以下文档:https://developers.google.com/chrome/mobile/docs/user-agent
这是Chrome for iOS UA字符串:
Mozilla/5.0 (iPhone; U; CPU iPhone OS 5_1_1 like Mac OS X; en) AppleWebKit/534.46.0 (KHTML, like Gecko) CriOS/19.0.1084.60 Mobile/9B206 Safari/7534.48.3
Run Code Online (Sandbox Code Playgroud)
这里是iOS UA字符串的Safari:
Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1A543 Safari/419.3
Run Code Online (Sandbox Code Playgroud)
尽管我可以说明未来的不同之处将是Chrome包含"CriOS".我希望能够区分这两个浏览器,并因此设置使用正则表达式.
使用:
/Gecko\) (?!CriOS)/
Run Code Online (Sandbox Code Playgroud)
我能做到这一点,但我是偏执狂,因为我不在表达式中包含iPhone(也许这也会在Android上触发等)
我想编写以下正则表达式,在以下情况下返回匹配:
我该怎么做呢?
仅供参考我一直在使用rubular来测试reg exp,它非常棒http://rubular.com/