小编Fir*_*lem的帖子

使用Rails 3.1,您在哪里放置"特定于页面"的JavaScript代码?

据我所知,您的所有JavaScript都合并为1个文件.当Rails添加//= require_tree .application.js清单文件的底部时,默认情况下会执行此操作.

这听起来像是一个真正的生命保护程序,但我有点担心特定于页面的JavaScript代码.此代码是否在每个页面上执行?我想要的最后一件事是,只需要在1页上需要为每个页面实例化我的所有对象.

此外,代码是否也存在冲突的可能性?

或者你是否script在页面底部放了一个小标签,只是调用一个执行页面javascript代码的方法?

那你不再需要require.js了吗?

谢谢

编辑:我很感谢所有的答案......我认为他们并没有真正解决问题.其中一些是关于造型而且似乎没有关联...而其他人只是提到javascript_include_tag......我知道存在(显然......)但是看起来Rails 3.1的方式将会包括所有的将您的JavaScript编入1个文件,而不是在每个页面的底部加载单独的JavaScript.

我能想到的最好的解决方案是divids或classes 包装标签中的某些功能.在JavaScript代码,你只要检查idclass在页面上,如果是,您在运行与之相关联的JavaScript代码.这样,如果动态元素不在页面上,则JavaScript代码不会运行 - 即使它已包含在application.js由Sprockets打包的大量文件中.

我的上述解决方案的好处是,如果在100个页面中的8个页面中包含搜索框,则它将仅在这8个页面上运行.您也不必在网站的8个页面上包含相同的代码.实际上,您永远不必在任何地方再次在您的网站上包含手动脚本标记.

我认为这是我问题的实际答案.

javascript ruby-on-rails ruby-on-rails-3.1 sprockets asset-pipeline

386
推荐指数
11
解决办法
8万
查看次数

如果我调用Factory.build以使我的控制器测试更快,我怎么能让Factory Girl永远不会打到数据库?

我正在努力让我的Rails测试更快.我只有520次测试,但他们需要62秒才能在bash中运行,而82秒则在Rubymine中运行.

作为典型控制器测试的一个例子,我使用此代码以@user身份登录,并在我的RSpec控制器测试的CommentsController中创建基本的@comment:

before(:each) do
  @user = Factory.create(:user)
  sign_in @user

  @comment = Factory.create(:comment)
end
Run Code Online (Sandbox Code Playgroud)

你可能会意识到......这很慢.它构建了一个@user,但也为该用户构建了关联.同样的@comment.

所以我认为呼叫Factory.build(:user)可以解决它...但我得到了奇怪的错误.例如,current_user退货nil.

所以......我决定Factory.build()在父控制器中使用并删除所有之前的过滤器.但是,我的rspec日志仍然表示当我之后检查RSPec日志时,TON的插入数据库正在访问数据库(我们正在讨论数百行代码,仅用于3次测试!)

  before(:each) do
    @user = Factory.build(:user)
    #sign_in @user

    controller.stub(:authenticate_user!) #before_filter
    controller.stub(:add_secure_model_data) #before_filter
    controller.stub(:current_user).and_return(@user)

    @comment = Factory.build(:comment)
  end
Run Code Online (Sandbox Code Playgroud)

可悲的事实是,上述before(:each)块对测试性能有零影响.正如我所发现的,呼叫Factory.build()仍然会在内部呼叫Factory.create()子协会.

这是一个before(:each)有效删除RSpec日志中产生的垃圾的块.它给了我35-40%的测试性能提升

  before(:each) do
    @user = Factory.build(:user, :role => Factory.build(:role))
    #sign_in @user

    controller.stub(:authenticate_user!)
    controller.stub(:add_secure_model_data)
    controller.stub(:current_user).and_return(@user)

    # both of these are still super slow. WTF?!
    @site_update = Factory.build(:site_update, :id …
Run Code Online (Sandbox Code Playgroud)

ruby unit-testing controller ruby-on-rails devise

21
推荐指数
1
解决办法
5149
查看次数

Rails 3.0.7 - >如何让测试运行得更快?

我正在运行mysql,database_cleaner,Rspec等.到目前为止,我有大约518个测试,它们需要88秒才能运行.这对我来说是不可接受的,因为我的应用程序开发刚刚开始.

因此,在进一步研究之前,我想尝试找到减少运行这些测试所需时间的方法 - 希望无需实际更改测试.

在大多数情况下,我试图使用存根.但是,当我测试模型和查询时,我确实使用了数据库.

我认为database_cleaner正在减慢它们的速度,但我不知道如何在没有它的情况下测试查询和内容.

使用带有":memory:"选项的sqlite3似乎只能减少大约10秒钟(令人失望的结果......)

我能做些什么才能真正加快测试速度?

ruby testing performance ruby-on-rails

15
推荐指数
2
解决办法
1681
查看次数

当使用Jquery插入LI元素时,JavaScript有时不调整UL元素的高度

我有一个Html/JavaScript应用程序包含N列,需要足够大,包含所有列中的所有可能的LI元素.

简单的解决方案似乎计算每列中所有项目的高度,补偿填充,然后将高度设置为每列的总和.

当LI元素包含纯文本时,这很有用.不幸的是,当LI元素包含图像时,各种浏览器都存在问题.例如,当我第一次在FireFox中加载页面时,它看起来像下面的截图,但在另一次刷新时,它工作正常.它在Chrome中也无法正常工作.

屏幕截图显示UL元素的高度与LI元素不同步

我的应用程序在页面加载时不预先填充LI元素 - 它使用JavaScript,如下所示:

function populateUnsetAnswers(unsetCategoryAnswers) {
    for (i in unsetCategoryAnswers) {
        if (unsetCategoryAnswers.hasOwnProperty(i.toString())) {
            $('#categoryQuestionArea #possibleAnswers').append(
                categoryAnswerLiTag(unsetCategoryAnswers[i])
            );
        }
    }
}

function categoryAnswerLiTag(unsetCategoryAnswer) {
    var html = '<li id="' + unsetCategoryAnswer.id + '">';

    if (unsetCategoryAnswer.image) {
        html += '<img class="categoryAnswerImage" title="';
        html += unsetCategoryAnswer.text;
        html += '" src="/trainingdividend/rest/streaming/';
        html += unsetCategoryAnswer.image.fileName;
        html += '" style="height: ';
        html += unsetCategoryAnswer.image.height;
        html += ';';
        html += '" />';
    } else {
        html += unsetCategoryAnswer.text
    }

    html += '</li>';

    return …
Run Code Online (Sandbox Code Playgroud)

html javascript ajax height

13
推荐指数
1
解决办法
2169
查看次数

使用命名空间路由时路由错误

form_for当路由被命名时,你如何处理?我得到一些奇怪的路线错误,我真的希望得到.

例如,假设Admin::CompaniesController:admin在routes.rb 中的命名空间中调用了一个控制器:

namespace :admin do
  resources :companies
end
Run Code Online (Sandbox Code Playgroud)

大多数工作都很好,但是当我渲染一个新表单时出现错误.这是代码:

<%= simple_form_for(@company, :url => admin_company_path(@company)) do |f| %>
Run Code Online (Sandbox Code Playgroud)

这是错误信息:

ActionView::Template::Error: No route matches {:action=>"show", :controller=>"admin/companies", :id=>#<Company id: nil, name: nil, phone_number: nil, address: nil, postal_code: nil, is_enabled: true, courses_created: 0, province_id: nil, theme_id: nil, payment_plan_id: nil, created_at: nil, updated_at: nil>}
Run Code Online (Sandbox Code Playgroud)

我如何让铁杆在这里玩得很好?我显然想要一个用于编辑的URL,另一个用于新表单.通常情况下,我甚至不必提出:url我的form_for陈述,但由于嵌套,我被迫.

我现在不知道该怎么做,至少不是优雅的.

ruby routing controller namespaces ruby-on-rails

10
推荐指数
1
解决办法
3053
查看次数

子类化用户模型在Rails中真的很糟糕吗?

我从Rails得到了很多回击,因为我将User子类化为许多不同的子类.在我的应用程序中,并非所有用户都是平等的 实际上有很多模型对象,并不是每个用户类型都可以访问它们.

我还需要一种方法来做多态行为.例如,许多方法的行为会有所不同,具体取决于类型.这不是多态性的意思吗?

但事实是,我总是从Rails回来.默认值 - 特别是表单提交给参数哈希的方式 - 似乎像非子类模型一样工作.链接和参数哈希只是默认设置真正咬你的两种方式.

在Rails中为不同类型的用户处理复杂逻辑的"正确"方法是什么?在Java中,子类化模型可以工作 - 您不必通过箍来使其按照您希望的方式工作.但是在Rails中,很难让子类使用REST约定,它会在你忘记包含:as => :user时惩罚你,或者当你在链接中放入子类对象时惩罚你,例如edit_user_path(@user)< - 坏主意!

还有一个区域也很难处理.假设我有一个Company模型,它有很多Users.这些用户可以是导演,教师,学员等 - 所有不同的子类.

当我们创建帐户时,我们可能想要使用accepts_nested_attributes_for :users.但是,如果我们使用它,我们不能指定它创建的类.血淋淋的地狱!

似乎Rails中的所有内容都不希望您将模型子类化.如果你没有子类,一切都"正常".但如果你是子类,那你就是为了地狱.

解决办法是什么?

ruby model ruby-on-rails subclassing

9
推荐指数
1
解决办法
3194
查看次数

铁路的'陷阱'和学习曲线 - 它会永远停止吗?

我已经开发了几个星期的新rails项目,虽然我对这些令人敬畏的插件和框架中的一些非常棒的功能感到惊讶......我也有点失望.我很担心

我想我弄错了.

我应该按下,还是回到我熟悉的地方?(Java /春)

  1. 似乎除非你正在寻找"简单的例子",谷歌搜索规则的例外情况,特殊情况等确实妨碍了生产力,并且越来越成为我的常态.

  2. 主站点,博客,截屏视频等的文档和示例大多都已过时.对于那里的每5-10个例子,其中1个实际上是正确的.

  3. 做任何应该"正常工作"的新事物几乎都不会.我尝试并遵循文档和示例,但我的结果似乎有所不同,我发现文档和示例中从未提及过的问题.这似乎一直都在发生.

  4. 我尝试使用CoffeeScript的经验以及它与Rails的集成是一场灾难.无论何时发生"编译器错误"都无法看到问题是令人沮丧的.

  5. ActiveRelation真的很棒,直到你需要创建一个连接7个表的查询.然后它开始崩溃.我认为你可以更快地完成在Hibernate中完成的7表连接查询,并在你第一次学习它时可靠地完成.

  6. 在Rails中测试实际上非常困难.有太多的"魔术"正在进行中.由于Ruby是动态的,我不知道我需要调用什么来适当地测试一些东西.规则似乎总是有例外.

    例如,Devise的工作方式与您期望的一样......直到您想要在帮助器中测试Devise.它只是不起作用,所以你必须在测试中发明Devise生成的方法以使测试通过.您不需要为控制器执行此操作.

    有一些博客教授如何使用Rails进行测试,但它们非常简单,并没有多大帮助.其中有些实际上很糟糕.我发现如何以比我发现的许多博客更优越的方式有效地测试验证.我发现在测试时我经常独自一人.

  7. 为什么切换到生产时图像和样式表无法正常工作?疯了吧.如果你谷歌的话,很多人都会问这个...但框架并没有"正常工作".

    最终部署这个应用程序我很害怕.生产版本似乎没有像开发版本那样工作.害怕.

  8. 出于某种原因,在添加jquery-rails和devise之后,在ajax请求期间没有传递身份验证令牌.我必须添加4行javascript代码才能使其正常工作.这花了我5个小时.在Java中,因为你有适当的会话,你甚至不需要考虑这种类型的东西.

  9. 测试运行得很慢.我有大约780个测试,它已经比拥有1800个测试的Java项目花了更长的时间.

  10. 在浏览器中测试应用程序非常慢.渲染一些页面需要1/4秒......而且甚至没有那么多ORM动作正在进行!即使对于具有1个数据库查询的页面,也需要100-200毫秒.这太疯狂了.

  11. 文档通常是过时的.例如,试图覆盖Devise中的内容很痛苦,因为文档实际上告诉我做错了.只有经过几个小时的谷歌搜索并在另一个论坛上等待48小时后,我才能让别人告诉我我需要做什么.我想做的就是让登录表单拒绝User.enabled为false的用户.而已.事实证明,我压倒一切"活跃?" 而不是"active_for_authentication?" - 这是RDoc中的一个错误.

  12. ORM表现得非常奇怪,完全不直观.关联新对象时,插入/更新的工作方式不同.它也不像Hibernate那样级联...这让我怀疑它不跟踪脏对象?如果是......那么为什么默认情况下没有设置级联?像这样的事情几乎不是很好的违约.Rails不应该在良好的默认值下表现出色吗?

2周后,"陷阱"的数量并没有真正放缓.我真的很担心和害怕.我知道Java不存在问题和问题,但我一般每个问题大约2-3次 - 而不是一周30次.

当你考虑平台的稳定性,快速性和可预测性时,我几乎认为使用Java/Spring时缺乏灵活性并不是一个负担.你可能会写更多的代码,但你确切地知道发生了什么......你从来没有真正处理过沉默的失败......事情的确往往更加可靠.

我开始质疑使用Rails进行这个新项目.

ruby java spring ruby-on-rails

8
推荐指数
1
解决办法
362
查看次数

如何在RSpec中分解常见的"之前(:每个)"调用,以便多个规范可以使用它们?

我想要考虑这一堆代码,以便我的所有控制器测试(好吧,几乎所有这些)都使用这个before(:each)块:

before(:each) do
  @user = User.new
  controller.stub(:authenticate_user!)
  controller.stub(:current_user).and_return(@user)
  controller.stub(:add_secure_model_data)
end
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点?我不想将它包含在所有控制器中...因为有一些不需要它.基本上,每个扩展的控制器SecureController都需要这个before(:each)块.

有没有好办法呢?

谢谢

ruby refactoring unit-testing rspec ruby-on-rails

8
推荐指数
1
解决办法
876
查看次数

如何在轨道中使用carrierwave'裁剪图像?

我想要做的是上传图像,然后将用户带到一个新页面,我将使用Jcrop让用户选择他们想要裁剪的图像部分,然后存储该图像.基本上,我想让它成为一个两阶段的过程.

我知道如何做javascript部分,我理解如何创建这个功能的基本流程.但是,我不知道有关如何实现此目的的载波具体细节.

我能找到的最接近的是:

image.recreate_versions!
Run Code Online (Sandbox Code Playgroud)

但我仍然无法传递高度/宽度并开始x,y来裁剪它.

例如,我如何告诉carrierwave"事后"进行裁剪 - 即不是第一次上传图像时?我看到了"处理"图像的方法,但它们会自动以固定的高度和宽度发生.我怎么能推迟这个?

基本上,我想要做的是动态定义一个版本,我可以在其中指定高度和宽度以及x,y

谢谢

ruby file-upload ruby-on-rails carrierwave

7
推荐指数
1
解决办法
2448
查看次数

对于Rails中的关联,write_attribute的等价物是什么?

我想覆盖关联的setter,但write_attribute()不起作用 - 可能是因为该方法仅适用于数据库列.

我已经尝试过super(),但这也不起作用(不认为它会...但值得一猜).

如何覆盖setter?这是我想要做的:

  def parent=(value)
    # this line needs to be changed
    write_attribute(:parent, value)

    if value.subject.start_with?('Re:')
      self.subject = "#{value.subject}"
    else
      self.subject = "Re: #{value.subject}"
    end

    self.receivers << value.sender
  end
Run Code Online (Sandbox Code Playgroud)

ruby overriding properties ruby-on-rails associations

7
推荐指数
2
解决办法
1604
查看次数

你如何让simple_form使用urls的基类而不是子类?

每当我使用simple_form_for()时,它默认为"my_subclasses_path"而不是"my_base_classes_path".我怎么能告诉它不使用子类?

在我的例子中,我有一个User对象,但也有很多子类.我想使用标准用户URL,因为所有子类对这些表单的工作方式相同.

另外,我想阻止simple_form在子类之后命名属性.例如,如果子类是"Admin",我希望提交的参数是"params [:user]"而不是"params [:admin]".

我发现以上内容真的很奇怪,因为表单实际上是"user [first_name]"而不是"admin [first_name]" - 但是simple_form似乎想让它成为params [:admin].

基本上,子类导致simple_for不能正常运行.我希望有一个选项

base_class => 'User'
Run Code Online (Sandbox Code Playgroud)

这将处理所有这些事情.

html ruby forms ruby-on-rails simple-form

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

使用Ubuntu 11.04,我无法使用CTRL-C关闭rails服务器

出于某种原因,当我键入"rails s"时,有时我无法使用CTRL-C关闭服务器.它使用Web brick,默认.

有时它会工作几个小时.其他时候它根本不起作用,如果我想关闭服务器,我必须不断杀死进程.

这是一个已知的问题吗?我该如何解决?

如果您需要了解更多信息,请询问,我会告诉您我能做什么.因为我不知道是什么导致它,我不知道为你提供什么信息.

编辑:我正在添加一个git存储库:

gem 'rails-dev-boost', :git => 'git://github.com/thedarkone/rails-dev-boost.git', :require => 'rails_development_boost'
Run Code Online (Sandbox Code Playgroud)

但公平地说,我没有启用此行的这个问题...而且当这个宝石线不存在时我也遇到了这个问题.

shutdown ruby-on-rails

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

Rails 3模型子类让我疯狂!请帮助纠正网址/参数哈希值

我对子类化铁的模型有问题.假设你有一个User模型,它的几个子类(用户类型)存储特定的方法和协会,例如:Director,Admin,Trainee,Instructor,等这只是简单的"单表继承".问题是2倍.

  1. 当您传递子类而不是基类时,路径/ URL经常崩溃或做一些奇怪的事情.这是一个例子:

    <% if user.enabled? %>
      <%= link_to 'Disable', disable_user_path(user) %>
    <% else %>
      <%= link_to 'Enable', enable_user_path(user) %>
    <% end %>
    
    Run Code Online (Sandbox Code Playgroud)

    如果你传入一个User模型,它就可以正常工作.但是如果你传递一个子类Admin,就会抛出这个异常:

    No route matches {:controller=>"users", :action=>"disable", :id=>#<Admin id: 1, first_name: "Ken", ..., created_at: "2011-05-23 21:01:35", updated_at: "2011-05-23 21:04:28">}
    
    Run Code Online (Sandbox Code Playgroud)

    显然,这表现不正常.我们怎样才能让rails一直使用基类?

  2. 形式更令人不安(我正在使用simple_form).假设你有一张/profile表格.您希望所有User子类同等地访问它,并且您不希望在特殊情况下处理它们的子类; 它应该是100%通用的.

    出于某种原因,如果用户是a Admin,则会将params hash发布为

    params[:admin]
    
    Run Code Online (Sandbox Code Playgroud)

    更糟糕的是,如果你查看表单的来源,它实际上是user[first_name]代替admin[first_name],而是一些东西肯定是搞砸了!实例变量也是@user如此,所以我不明白它为什么要发布到params[:admin].

这是(2)的表单视图代码:

<%= …
Run Code Online (Sandbox Code Playgroud)

ruby inheritance model ruby-on-rails subclass

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