在Ruby on Rails应用程序中为对象编写"create"方法时,我使用了两种方法.我想使用一种方法,以便更清晰,更一致的代码.我将列出以下两种方法.有人知道一个人比另一个好吗?如果是这样,为什么?
方法1:
def create1
# is this unsecure? should we grab user_id from the session
params[:venue]['user_id'] = params[:user_id]
begin
venue = Venue.create(params[:venue])
@user_venues = @user.venues
render :partial => 'venue_select_box', :success => true, :status => :ok
rescue ActiveRecord::RecordInvalid
render :text => 'Put errors in here', :success => false, :status => :unprocessable_entity
end
end
Run Code Online (Sandbox Code Playgroud)
方法2:
def create2
# is this unsecure? should we grab user_id from the session
params[:venue]['user_id'] = params[:user_id]
venue = Venue.new(params[:venue])
if venue.save
@user_venues = @user.venues
render …Run Code Online (Sandbox Code Playgroud) 一般混乱
我有乐队可以有3种类型.我在之前的SO文章中读到,处理这个问题的正确方法是几个步骤:
1)在band.rb
has_and_belongs_to_many :genres
Run Code Online (Sandbox Code Playgroud)
2)创建band_genres连接表
即使阅读了文档后,我对HABTM的实际含义感到有些困惑.我想我通常会认为"一个乐队有很多类型",没有并且属于很多.因此,对此的快速DUMBED解释将是伟大的.
与夹具混淆
另外,当我为band_genres做夹具时,我有
{
"The Reaper Band and Funk": { "band": "The Reaper Band", "genre": "Funk" },
"The Reaper Band and Rock": { "band": "The Reaper Band", "genre": "Rock" }
}
Run Code Online (Sandbox Code Playgroud)
我得到了一个"未知"的乐队专栏.我认为rails应该知道"The Reaper Band"会指一个乐队乐队的乐队(当然是同名)并且会抓住那个id并且知道这个乐器中的"band"会引用连接表中的band_id .我宁愿我的灯具看起来像硬编码的数字.
与工厂混淆
当我在工厂创建一个乐队时,我想指定它的类型:
Factory.define :band do |f|
f.sequence(:name) { |n| "Band#{n}" }
f.mailing_lists { |mailing_lists| [mailing_lists.association(:mailing_list)] }
f.genres 2
end
Run Code Online (Sandbox Code Playgroud)
我在这里意识到我可能需要一个硬编码的genre_id.但是为什么rails不看那个并说"哦,他想把id = 2的类型添加到band_genres表".
我不期待铁路为我处理所有肮脏的工作,但我确实想按照规则行事.
我的Rails应用程序开始需要复杂的查询.我应该开始使用原始SQL查询吗?Rails社区的趋势是什么?
更新:
我现在没有书面查询,我想在开始之前问这个问题.但这是我想要做的一个例子:
我有有类别的书.我想说-
Give me all books that were:
-created_at (added to store) between date1 and date2
-updated_at before date3
-joined with books that exist in shopping carts right now
Run Code Online (Sandbox Code Playgroud)
我还没有编写查询,但我认为rails版本将是这样的:
books_to_consider = Book.find(:all,
:conditions => "created_at <= '#{date2}' AND created_at >= '#{date1}' AND updated_at <= '#{date3}'",
:joins => "as b inner join carts as c on c.book_id = b.id")
Run Code Online (Sandbox Code Playgroud)
我并不是说ActiveRecord无法处理这个查询,但是为了便于阅读(或者还有其他我还不知道的限制),是否更容易接受原始SQL?
我见过Ryan Bates谈论exception_logger和异常通知.还有其他好的东西需要考虑吗?你喜欢和不喜欢这些什么?
另外,如果你抓住它们,这些异常通知程序会记录异常吗?
谢谢!
我已阅读有关会话固定的内容,据我了解,它强迫用户使用攻击者的会话.它是否正确?你能告诉我一个如何冒犯用户的例子吗?
MongoDB中的常见做法是使用短密钥名称来节省空间.例如,有人可能想使用"fn"而不是"first_name"
但是在你的应用程序中,如果你在整个地方使用"fn",你就会被搞砸了.太难看了.特别是对于Rails,在Mongoid中声明字段时是否有一种简单的方法来指定别名?
另外,有没有人知道任何使用Mongoid的开源示例项目?
谢谢!
格式化列或行似乎没有问题.我在文档中搜索了一堆,进行了一些搜索,并查看了一些电子表格对象上的"方法"结果,我无法弄清楚如何格式化特定的单元格.有没有人这样做过?
电子表格库位于:http : //spreadsheet.rubyforge.org/ http://spreadsheet.rubyforge.org/GUIDE_txt.html
我正在开发一个需要发送短信的应用程序,因此我将运营商信息存储在数据库中.我还需要XML文件中的信息来读取客户端代码.为了实现这一点,我正在编写一个脚本,从DB读取运营商信息并在config目录中创建XML文件.我觉得这个脚本最适合lib/tasks.
我需要从这个脚本访问数据库,但我想使用一些对象来访问它.如果我使用
db = Mysql.new("domain", "username", "password", "database")
Run Code Online (Sandbox Code Playgroud)
我将不得不为不同的环境保留多个版本,因为我不会一直使用MySQL.那将是非常草率的.我相信有办法做到这一点.我试图访问该对象...这是我到目前为止:
RAILS_HOME = File.expand_path(File.join(File.dirname(__FILE__),"../.."))
RAILS_CONFIG = "#{RAILS_HOME}/config"
f = File.new("#{RAILS_CONFIG}/mls_widget_config.xml", "w")
carriers = Carrier.find_all
f.write carriers
f.close
Run Code Online (Sandbox Code Playgroud)
但Carrier没有定义,这是有道理的.如何让这个脚本访问DB中的Carrier对象?
另外作为一方,如果有人知道如何轻松地将我从数据库中读取的内容转换为适当的XML,那将是非常好的.我打算快速写一些自定义的东西.
谢谢!
下面是我复制的代码(来自这个网站)并且只是稍微修改,因为原始代码无法编译.我想操纵字节数组进行边缘检测并最终简单地改变颜色,但首先我想让基本代码工作.目前,系统编译并运行.它在屏幕上显示一幅画得很厉害的大象.当我触摸图像时,它会消失.单步执行将imageWithData的结果显示为0x0.我用png和bmp尝试了同样的结果
我做错了什么线索?!
ImageViewDrawable定义为:
@interface ImageViewDrawable : UIImageView
// I am using the following code to initialize this ImageView
ImageViewDrawable * uiv = [[ImageViewDrawable alloc] initWithImage:[UIImage imageNamed:@"ele.png"] ];
-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
// get and work on pixel data
NSData* pixelData = (NSData*) CGDataProviderCopyData(CGImageGetDataProvider(self.image.CGImage));
char* bytes =[pixelData bytes];
// Take away the red pixel, assuming 32-bit RGBA
for(int i = 0; i < [pixelData length]; i += 4) {
bytes[i] = bytes[i]; // red
bytes[i+1] = bytes[i+1]; // green …Run Code Online (Sandbox Code Playgroud) 我正在使用BluePill来管理诸如Rails的延迟作业之类的进程.在BluePill日志中,我收到此消息:
W, [2010-09-27T01:23:20.447053 #19441] WARN -- : [fsg_distro:delayed_job] pid_file /srv/fsg_distro/shared/pids/delayed_job.pid does not exist or cannot be read
W, [2010-09-27T01:23:20.447368 #19441] WARN -- : [fsg_distro:delayed_job] Executing start command: ruby script/delayed_job -e production start
I, [2010-09-27T01:23:20.469165 #19441] INFO -- : [fsg_distro:delayed_job] Going from down => starting
Run Code Online (Sandbox Code Playgroud)
所以它声称丢失了一个pid文件,但是当BluePill启动延迟作业进程时,不应该创建pid吗?
更新 要更清楚地了解此错误,我可以手动成功运行该命令,但Bluepill无法运行启动命令.当我手动运行它时,它看起来像这样:
rails@george:/srv/fsg_distro/current$ /usr/bin/env RAILS_ENV=production /usr/bin/ruby /srv/fsg_distro/current/script/delayed_job start
delayed_job: process with pid 17564 started.
Run Code Online (Sandbox Code Playgroud)
当我使用Bluepill运行它时,它看起来像这样:
W, [2010-10-03T21:24:13.943136 #17326] WARN -- : [fsg_distro:delayed_job] pid_file /srv/fsg_distro/shared/pids/delayed_job.pid does not exist or cannot be read
W, [2010-10-03T21:24:13.943391 #17326] WARN …Run Code Online (Sandbox Code Playgroud)