假设我有一个名为Thing的Rails模型.Thing有一个url属性,可以选择将其设置为Internet上的某个URL.在视图代码中,我需要执行以下操作的逻辑:
<% if thing.url.blank? %>
<%= link_to('Text', thing_path(thing)) %>
<% else %>
<%= link_to('Text', thing.url) %>
<% end %>
Run Code Online (Sandbox Code Playgroud)
视图中的这种条件逻辑很难看.当然,我可以构建一个辅助函数,它会将视图更改为:
<%= thing_link('Text', thing) %>
Run Code Online (Sandbox Code Playgroud)
这解决了冗长问题,但我真的更喜欢模型本身的功能.在这种情况下,视图代码将是:
<%= link_to('Text', thing.link) %>
Run Code Online (Sandbox Code Playgroud)
显然,这需要模型上的链接方法.这是它需要包含的内容:
def link
(self.url.blank?) ? thing_path(self) : self.url
end
Run Code Online (Sandbox Code Playgroud)
就问题而言,thing_path()是Model代码中未定义的方法.我假设可以将一些辅助方法"拉入"模型中,但是如何?是否有一个真正的原因,路由只在控制器上运行并查看应用程序层?我可以想到许多模型代码可能需要处理URL(与外部系统集成等)的情况.
在.NET项目中应该有哪些帮助类的最佳实践是什么?引用与业务层事物分开的类,但是演示和应用程序的东西,如appSetting配置管理器和其他有时是模块特定或有时在整个应用程序中使用的代码.
我有一个方法,它接受一个字符串数组并加入它们,所以他们做这样的事情:
>> my_arr
=> ["A", "B", "C"]
>> and_join(my_arr)
=> "A, B, and C"
Run Code Online (Sandbox Code Playgroud)
我希望我的邮件程序可以访问,以便我可以将一些信息输出到电子邮件中.我似乎无法找到一个好的地方把它放在application_helper.rb文件中,它在那里找不到它.它应该去哪里?
我问,因为我试图使用一个模拟框架(Mockito),它不允许你模拟静态方法.调查一下我发现有不少博客文章说你应该尽可能少的静态方法,但是我很难理解为什么.特别是为什么不修改全局状态的方法基本上是辅助方法.例如,我有一个名为ApiCaller
有几个静态方法的类.静态方法的一个目的是执行HTTP调用,处理我们的服务器可能返回的任何自定义问题(例如用户未登录)并返回响应.为了简化,例如:
public class ApiCaller {
...
public static String makeHttpCall(Url url) {
// Performs logic to retrieve response and deal with custom server errors
...
return response;
}
}
Run Code Online (Sandbox Code Playgroud)
要使用这一切,我所要做的就是调用ApiCaller.makeHttpCall(url)
Now我可以很容易地将它变为非静态方法,如:
public class ApiCaller {
...
public String makeHttpCall(Url url) {
// Performs logic to retrieve response and deal with custom server errors
...
return response;
}
}
Run Code Online (Sandbox Code Playgroud)
然后使用此方法调用,new ApiCaller().makeHttpCall()
但这似乎是额外的开销.任何人都可以解释为什么这是坏的,如果有一个更好的解决方案使方法非静态(除了删除关键字),以便我可以使用模拟框架存根这些方法?
谢谢!
我有以前有大量方法的类,所以我将这个方法的工作细分为'helper'方法.
这些辅助方法被声明private
为强制封装 - 但是我想对大型公共方法进行单元测试.对辅助方法进行单元测试也是好的,就好像其中一个方法失败了,调用它的公共方法也会失败,这样我们就可以找出它失败的原因了吗?
另外,为了使用模拟对象测试这些,我需要将其可见性从私有更改为受保护,这是否可取?
好的,我在应用程序控制器中有一个辅助方法:
def run_test(test_name)
#computation stuff
render :partial => test_name
end
Run Code Online (Sandbox Code Playgroud)
我在观点中称之为:
<%= run_test("testpartial") %>
Run Code Online (Sandbox Code Playgroud)
并且它只用1渲染(虽然......渲染部分似乎返回一个数组而不仅仅是部分内容?),但是如果我在视图中放入run_test辅助调用两次,我会得到一个双渲染错误,不应该发生偏袒.
有任何想法吗?
在一堆rspec rails单元规格中,我做了类似的事情:
describe Foo do
[:bar, :baz].each do |a|
it "should have many #{a}" do
Foo.should have_many(a)
end
end
end
Run Code Online (Sandbox Code Playgroud)
为了更清洁的代码,我宁愿做类似的事情:
describe Foo do
spec_has_many Foo, :bar, :baz
end
Run Code Online (Sandbox Code Playgroud)
那么如何编写一个辅助方法,比如spec_has_many()
插入像rspec 方法那样的DSL代码it()
呢?如果它是一个普通的实例方法,我会做类似的事情:
def spec_has_many(model, *args)
args.each do |a|
define_method("it_should_have_many_#{a}") do
model.should have_many(a)
end
end
end
Run Code Online (Sandbox Code Playgroud)
定义rspec示例的等价物是什么?
我已经看到在应用程序控制器方法中经常使用或等于|| =来设置变量(如果它不存在).最近的Railscasts 270.但我有一个问题..例如这个帮助方法
def current_user
@current_user ||= User.find(session[:user_id]) if session[:user_id]
end
Run Code Online (Sandbox Code Playgroud)
根据我的理解,如果@current_user尚不存在,则设置它.这意味着rails不必去数据库,性能获胜等.
但是我对@current_user的范围感到困惑.假设我们网站有两个用户.第一个(让我们称之为"bob")来到网站并将@current_user设置为他的用户对象.现在当第二个("john")进来并且rails要求@current_user时...为什么用户对象仍然不是bob的?毕竟@burrent_user已经设置了一次当bob命中网站所以变量存在?
困惑.
我知道我可以在Rails文件夹中的Helper
类中放置一个帮助器方法helper
.然后该方法可以在任何视图中使用.我知道我可以在ApplicationController
类中放置方法,并且该方法可以在任何控制器中使用.
放置控制器和视图中经常使用的方法的适当位置在哪里?
ruby-on-rails helpermethods ruby-on-rails-3 ruby-on-rails-3.2 ruby-on-rails-4
背景:我有一个大型(几百行)类,它管理基于一些原始类型数据结构的概念
long[] slist; //list of unique patterns (related to polyominoes)
int[][][] sref;//patterns at each place [location][depth][<list of indices in slist>]
Run Code Online (Sandbox Code Playgroud)
问题:填充和更新这些数据的两种方法会很长,有少量 5-20 行任务,有些是共享的,有些是独特的。我可能想为每个子任务制作一个辅助方法。
update(...){
//do A
//do B
//do C
//...
}
build(){
//do D
//do B
//do E
//...
}
Run Code Online (Sandbox Code Playgroud)
问题是如果一个文件中有太多不相关的辅助方法,可读性不会提高。
这个问题的答案让我大部分时间都在那里。我可以在同一个包中,在它们自己的类中声明结构,并访问原始成员字段或调用相关方法。但我仍然想知道这里公认的智慧,因为这个组织并不容易想到。
你会在他们自己的文件中放置update()
和build()
运行吗?如果是这样,他们的共同任务应该在哪里声明?
helpermethods ×10
java ×3
.net ×1
actionmailer ×1
android ×1
c# ×1
helper ×1
jmock ×1
junit ×1
mockito ×1
oop ×1
rspec ×1
ruby ×1
unit-testing ×1