在Rails 3.2索引视图中,我呈现两个部分.
<%= render :partial => 'users/user', :locals => {:users => @happy_users} %>
<%= render :partial => 'users/user', :locals => {:users => @sad_users} %>
Run Code Online (Sandbox Code Playgroud)
在部分
<% users.each do |user| %>
Show some fields
<% end %>
<%= will_paginate users %>
Run Code Online (Sandbox Code Playgroud)
分页不起作用.
如果我改变will_paginate采取实例变量,分页工作(但错误的集合)
<%= will_paginate @users %>
Run Code Online (Sandbox Code Playgroud)
当调用partial时,如何将locals传递给will_paginate?
(我意识到我还需要传递:param_name以使用两个集合.现在我只是想让一个实例工作.)
部分通过index.js.erb呈现
$(".ajaxable-users").html('<%= escape_javascript(render("users/user")) %>');
Run Code Online (Sandbox Code Playgroud)
控制器看起来像
def index
@users = User.scoped.paginate(:page => params[:page], :per_page => 5)
@happy_users = User.happy_scope.paginate(:page => params[:page], :per_page => 5)
@sad_users = User.happy_scope.paginate(:page => params[:page], …Run Code Online (Sandbox Code Playgroud) 如何在Rails应用程序中根据当前用户的节目视图?
我想做点什么
authenticated :user do
root :to => "users#show"
end
Run Code Online (Sandbox Code Playgroud)
但是如何将当前用户的ID传递给此?
谢谢
我正在向Rails应用程序添加国际化,并且或多或少地遵循相关的Rails指南和Railscast.
我遇到了两个问题:
我的设置如下
application_controller.rb
before_filter :set_locale
def default_url_options(options = {})
{locale: I18n.locale}
end
private
def set_locale
I18n.locale = params[:locale] if params[:locale].present?
end
Run Code Online (Sandbox Code Playgroud)
的routes.rb
scope ":locale", locale: /#{I18n.available_locales.join("|")}/ do
all_my_routes
# handles /valid-locale
root to: 'home#index', as: "localized_root"
# handles /valid-locale/fake-path
match '*path', to: redirect { |params, request| "/#{params[:locale]}" }
end
# handles /
root to: redirect("/#{I18n.default_locale}")
# handles /bad-locale|anything/valid-path
match '/*locale/*path', to: redirect("/#{I18n.default_locale}/%{path}")
# handles /anything|valid-path-but-no-locale
match '/*path', to: redirect("/#{I18n.default_locale}/%{path}")
Run Code Online (Sandbox Code Playgroud)
我的主页链接:
<%= link_to "Home", …Run Code Online (Sandbox Code Playgroud) 突然,我的Rails 4.2应用程序没有向development.log写任何内容.
绝对没有!
我已经尝试检查正在使用的正确环境,重新启动服务器,检查可能与记录器交互的gems,检查权限logger.flush,等等rake log:clean.
日志文件现在完全为空,并且没有写入任何内容.
跑步rails s给出:
=> Booting WEBrick
=> Rails 4.2.0 application starting in development on http://localhost:3000
=> Run `rails server -h` for more startup options
=> Ctrl-C to shutdown server
[2015-03-14 18:49:57] INFO WEBrick 1.3.1
[2015-03-14 18:49:57] INFO ruby 2.1.5 (2014-11-13) [x86_64-darwin14.0]
[2015-03-14 18:49:57] INFO WEBrick::HTTPServer#start: pid=3963 port=3000
Run Code Online (Sandbox Code Playgroud)
Stackoverflow上有很多类似的问题,但没有一个提供我的案例中有效的答案.
我不知道是什么导致这个或如何系统地调试.
我应该采取什么措施?
Rails应用程序中的模型有一个url列,用户可以在其中输入外部站点的地址.
网址显示在页面上.点击后,除了路由到该网址外,我还需要在应用中执行一些操作.所以我定义了一个控制器动作如下
#objects_controller.rb
def click
@object = Object.find params[:id]
# do some stuff
respond_to do |format|
format.html { redirect_to @object.url }
end
end
Run Code Online (Sandbox Code Playgroud)
并在视图中
<%= 'click me', click_object_path @object %>
Run Code Online (Sandbox Code Playgroud)
Brakeman(正如预期的那样)发出警告
High - Redirect - Possible unprotected redirect
Run Code Online (Sandbox Code Playgroud)
通常,解决方案是添加only_path: true到重定向并仅允许当前应用程序中的重定向.但在这种情况下,所需的行为是导航到外部站点.
我的问题
任何人都可以帮我解决这个问题的根源吗?
我在Rails 3.2应用程序中使用Devise + Omniauth.我想知道的是,用Devise的user_omniauth_authorize_path(provider)方法在幕后发生了什么.
我已经通过rake路线和宝石的来源进行了挖掘,但是我看不到任何明显的东西会导致我遇到的问题.
我假设这个方法只是调用提供者的登录URL(例如Twitter),然后返回到routes.rb中定义的回调路径.
在我的routes.rb我有
devise_for :users, :controllers => { :omniauth_callbacks => 'users/omniauth_callbacks'}
devise_scope :user do
get '/users/auth/:provider' => 'users/omniauth_callbacks#passthru'
end
Run Code Online (Sandbox Code Playgroud)
在users/omniauth_callbacks_controller.rb我有
def twitter
render :text => "This works"
end
def passthru
render :text => "This doesn't work"
end
Run Code Online (Sandbox Code Playgroud)
在我看来<%= link_to "Twitter", user_omniauth_authorize_path(:twitter) %>.点击此链接转到我可以登录的Twitter,但在返回我的应用程序后,我收到错误"您已登录".
我无法弄清楚如何或为什么生成此错误.我应该只看到"这个有效"或"这不起作用".
我也有一个Facebook提供商以完全相同的方式设置,这可以按预期工作.
如果我替换Devise的omniauth链接,<a href="/users/auth/twitter">Twitter</a>那么我得到"This works".
所以这解决了我的问题,但它并不理想,我想知道为什么.
谁能摆脱任何光明?
编辑
Rake路线如下所示:
user_omniauth_callback /users/auth/:action/callback(.:format) users/omniauth_callbacks#(?-mix:twitter|facebook)
Run Code Online (Sandbox Code Playgroud) 我有一个包含 pg_search 和 queue_classic gems 的 Rails 应用程序。这两个都使用 PostgreSQL 扩展,例如 unaccent、pg_trgm 和 ps-something-something(抱歉,不是我的开发机器,不记得了)。
我正在部署到 Heroku,并且无法运行执行这些扩展的迁移
例如,
def up
execute "create extension unaccent"
execute "create extension pg_trgm"
end
Run Code Online (Sandbox Code Playgroud)
我的印象是 Heroku 从这里支持这些https://devcenter.heroku.com/articles/full-text-search以及 Heroku 使用 queue_classic https://github.com/ryandotsmith/queue_classic的事实。
我一直找不到任何信息来解释如何在 Heroku 上使用这些 postgres 扩展。或者即使它们可用于共享数据库或仅专用。
所以我的问题:
真的很感激任何想法,尤其是那些附有相关信息/说明指示的想法。
谢谢
在将Rails应用程序部署到Heroku之后,没有任何javascript函数正在运行.
这些文件似乎已被编译(虽然在缩小的文件中不容易看到).
什么是步骤来解决javascript无法正常工作的逻辑过程(它在生产中工作正常).
谢谢
我的Capybara/Rspec套件中有四个测试失败(CI部署的真正问题).
最糟糕的是,这些测试间歇性地失败,并且通常仅在整个套件运行时才会进行调试.
它们都是ajax请求,要么提交远程表单,要么单击远程链接,然后是expect(page).to have_content 'My Flash Message'.
这些测试甚至在同一测试周期内间歇性地失败.例如,我有几个表现相似的模型,所以我正在迭代它们进行测试.
e.g.,
['Country', 'State', 'City'].each do |object|
let(:target) { create object.to_sym }
it 'runs my frustrating test' do
end
end
Run Code Online (Sandbox Code Playgroud)
有时国家失败,有时国家,有时一切都过去了.
我已经尝试添加wait: 30到expect语句中.我sleep 30在expect语句之前尝试过添加.我还在接受间歇性传球.
有很多信息描述了挑剔的ajax测试,但我还没有找到很多关于如何调试和修复这些问题的信息.
在我拔掉头发之前,我真的很感激任何人的建议或指点!
谢谢你们所有这些出色的回应.看到其他人已经解决了类似的问题并且我并不孤单,这很有用.
那么,有解决方案吗?
使用调试工具的建议如pry,byebug,Poltergeist的调试功能(感谢@ Jay-Ar Polidario,@ TomWalpole)有助于确认我认为我已经知道的东西 - 即,@ BM5K建议的那些功能是有效的一直在浏览器中,错误在于测试.
我尝试调整超时和重试(@ Jay-Ar Polidario,@ BM5K),虽然这些改进仍然不是一致的修复.更重要的是,这种方法感觉就像修补孔而不是正确的修复,所以我并不完全舒服.
最后,我对这些测试进行了重大改写.这需要分解多步功能,并单独设置和测试每个步骤.虽然纯粹主义者可能声称这不是从用户的角度进行真正的测试,但每次测试之间都有足够的重叠,我对结果感到满意.
在完成这个过程时,我注意到所有这些错误都与"点击事物或填写表格"有关,正如@BoraMa建议的那样.虽然在这种情况下经验被颠倒了 - 我们采用了.trigger('click')语法,因为capybara + poltergeist报告使用click_linkor 点击元素时出错find(object).click,而且这些测试都是有问题的.
为了避免这些问题,我尽可能地从测试中删除了JS.即,在没有启用JS的情况下测试大部分功能,然后创建非常短的,有针对性的JS规范来测试特定的JS响应,功能或用户反馈.
所以没有一个单独的修复.一种重要的重构,说实话,可能需要发生并且是一项有价值的练习.通过将所有内容分解为单独的测试,测试已经失去了一些功能,但总体而言,这使得测试更容易阅读和维护.
仍有一些测试偶尔显示为红色,需要更多工作.但整体上有很大改进.
感谢大家的指导,并向我保证测试环境中的交互可能是根本原因.
在 Rails 应用程序中,我开始在日志和测试输出中看到以下内容。
warning: parser/current is loading parser/ruby25, which recognizes
warning: 2.5.5-compliant syntax, but you are running 2.5.3.
warning: please see https://github.com/whitequark/parser#compatibility-with-ruby-mri.
Run Code Online (Sandbox Code Playgroud)
这是来自Rubocop。
我知道 Rubocop 检查应用程序根目录中是否存在 .ruby-version 文件并使用它指定的 Ruby 版本。https://rubocop.readthedocs.io/en/latest/configuration/#setting-the-target-ruby-version
Rails 应用程序包含这样一个文件
/.ruby-version
ruby-2.5.3
Run Code Online (Sandbox Code Playgroud)
为什么 Rubocop 会针对错误的 Ruby 版本运行检查?