小编tsm*_*tsm的帖子

Rails可选belongs_to

我正在为库存管理编写Rails前端.我希望用户能够注册产品,所以我有:

class User < ActiveRecord::Base
  has_many :products
  # <snip>
end
Run Code Online (Sandbox Code Playgroud)

class Product < ActiveRecord::Base
  belongs_to :user
  # <snip>
end
Run Code Online (Sandbox Code Playgroud)

问题是产品是在用户注册之前创建的.也就是说,这是完全可以接受的呼吁Product.create,只是把它设置user_idnil.但是,正如您可以想象的那样,Rails不支持开箱即用:

> Product.create!
   (0.3ms)  SELECT COUNT(*) FROM "products" WHERE "products"."type" IN ('Product')
   (0.1ms)  begin transaction
   (0.1ms)  rollback transaction
ActiveRecord::RecordInvalid: Validation failed: User can't be blank
    from ~/.rvm/gems/ruby-2.0.0-p0/gems/activerecord-3.2.13/lib/active_record/validations.rb:56:in `save!'
Run Code Online (Sandbox Code Playgroud)

我已经考虑过一堆kludgey解决方法,其中最吸引人的是有一个NullUser子类User并使用它来创建产品.但这似乎仍然是一个黑客.这是什么Rails方式?

谢谢.


相关迁移:

class AddUseridToProducts < ActiveRecord::Migration
  def change
    add_column :products, :user_id, :integer
  end
end
Run Code Online (Sandbox Code Playgroud)

然后:

class Changeuseridtobeoptionalforproducts < ActiveRecord::Migration
  def change …
Run Code Online (Sandbox Code Playgroud)

ruby activerecord ruby-on-rails

48
推荐指数
3
解决办法
3万
查看次数

Clojure(读取行)返回nil; 没有提示

我正在研究我的第一个适当的Clojure程序 - 国际象棋游戏.我有以下内容:

(defn human-move [board]
  (board-utils/print-board board)
  (print "Enter your move, like this: 'E7 E5' ...")
  (loop [raw-move (terminal-input)] ;;(read-line)]
    (println "I just received" raw-move)
    (if (re-matches #"[A-H][1-8]\s[A-H][1-8]" raw-move)
      (parse-move raw-move)
      (do
        (println "Invalid format! There should be a letter, number, space, letter, and final number.")
        (print "Try again: ")
        (recur (read-line))))))
Run Code Online (Sandbox Code Playgroud)

请注意read-line注释掉并替换为的位置terminal-input.read-line给了我一个NullPointerException,所以出于诊断目的:

(defn terminal-input []
  (println "input")
  (let [whatnot (read-line)]
    (println "received" whatnot)
    whatnot))
Run Code Online (Sandbox Code Playgroud)

然后,当我打电话human-move.

...
+---+---+---+---+---+---+---+---+
| P | …
Run Code Online (Sandbox Code Playgroud)

clojure

5
推荐指数
2
解决办法
1056
查看次数

Ant 不会重新编译常量

我有一个 Java 项目,涉及类GUIConstants-public static final用于布局 GUI 的各种参数,因为不同的组件有时必须具有相同的大小或颜色或其他。

我目前正处于进行视觉重新设计的阶段,其中涉及更改其中一些常量。然而,ant这让这变得困难。我将更改一个参数并重新编译,但仍使用旧值。如果我对使用它的文件之一添加一些简单的修改并重新编译,将使用正确的值。但必须追踪所有文件并修改它们,这很烦人且容易出错。当然有一种方法可以强制ant重新编译未更改的文件......我只是在手册页中找不到它。

旁注:我的假设是,当编译使用变量的类时,Java 会使用值本身,而不是对变量所指向的任何内容的引用(与C 中使用常量的final方式类似)。#DEFINE因此,即使变量指向其他内容,原始值也会被烘焙到.class文件中。这是真的?(这不影响我的问题,我只是好奇。)

提前致谢。

java ant

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

Rails form_for 和 text_field 没有 model 属性

我正在编写一个表格供用户注册其产品。我已经有了class User has_many :productsclass Product belongs_to :user; attr_accessible :serial_number。所以我们的想法是,用户在表单中输入序列号,然后我打电话@user.products << Product.find_by_serial_number params[:serial_number]或类似的事情。

将其作为注册操作添加到以下似乎是明智的UsersController

resources :users do
  member do
    get 'register'
  end
end
Run Code Online (Sandbox Code Playgroud)

我有以下内容register.html.erb

5:   <%= render 'shared/error_messages' %>
6: 
7:   <%= f.label :serial_number, "Serial number" %>
8:   <%= f.text_field :serial_number %>
9: 
10:   <%= f.submit "Register product" %>
11: <% end %>
Run Code Online (Sandbox Code Playgroud)

这会引发错误:

undefined method `serial_number' for #<User:0x000000060b1d40>
extracted source (around line #8):
...
Run Code Online (Sandbox Code Playgroud)

那么...a) 我该如何停止这个错误?b) 嗯...按下提交按钮后会发生什么?我假设它会调用该update操作(编辑表单也使用该操作)...我应该使其更胖以处理这两种可能性吗?或者做出新的动作?(如果是这样,我如何重新路由表单以指向该表单?) c) …

ruby forms ruby-on-rails

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

在Rails项目中测试gem的本地版本

我的Rails网站使用了一个非常不错的宝石.每次我需要做一些新的事情时,我最终都要花费尽可能多的时间为gem添加功能,就像我在实际的Rails项目中添加代码一样.但是我不介意,我把我的Gemfile设置为指向我的GitHub宝石分叉(我尝试提交PR,但维护者似乎已经下台了).

问题是我真的没有找到一种理智的方法来测试我添加到gem中的新东西.在它内部测试它会特别好rails c,但我能想到的唯一方法是a)改变~/.rvm/gems/.../foo.rb,这似乎不正确或b)颠覆版本,推送到Github,并运行bundle up,除了耗费时间显然是一场灾难,因为我不确定我做出的提交是否正确.

我甚至对标准非常满意irb.但是require lib/foo来自gem目录内的各种排列都不起作用.

那么这里最好的做法是什么?

ruby gem irb bundler

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

枚举笛卡尔积,同时尽量减少重复

给出两组,例如:

{A B C}, {1 2 3 4 5 6}
Run Code Online (Sandbox Code Playgroud)

我想按照在相等元素之间放置尽可能多的空间的顺序生成笛卡尔积.例如,[A1, A2, A3, A4, A5, A6, B1…]不好,因为所有的As都是彼此相邻的.一个可接受的解决方案是"沿着对角线",然后每次它包裹偏移一个,例如:

[A1, B2, C3, A4, B5, C6, A2, B3, C4, A5, B6, C1, A3…]
Run Code Online (Sandbox Code Playgroud)

直观地表达:

|   | A | B | C | A | B | C | A | B | C | A | B | C | A | B | C | A | B | C |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 1 |   | …
Run Code Online (Sandbox Code Playgroud)

algorithm math enumeration cartesian-product discrete-mathematics

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

从JTable中删除正在编辑的行

我有一个JTable和一个旁边的按钮,它可以调用deleteSelectedRows(),它完全听起来像:

public void deleteSelectedRows() {
    int[] selected = jTable.getSelectedRows();
    for(int i = selected.length - 1; i >= 0; i--) {
        model.removeRow(selected[i]);
    }
    if(model.getRowCount() < 1) {
        addEmptyRow();
    }
}
Run Code Online (Sandbox Code Playgroud)

但是如果一个单元格被删除时(和/或其上方的单元格)被删除,则编辑的单元格会在剩下的时间内停留,如下所示:

然后试图退出编辑投掷,ArrayIndexOutOfBoundsException因为第5行试图访问,并且表中只剩下一行.

然后,我尝试了各种有趣的游戏jTable.getEditingRow().首先,if(selected[i] != editing)在删除之前添加一个似乎工作,但然后删除编辑单元格上方的行会导致问题.

然后我尝试了这个:

public void deleteSelectedRows() {
    int[] selected = jTable.getSelectedRows();
    int editing = jTable.getEditingRow();
    for(int s : selected) { //PS: Is there a better way of doing a linear search?
        if(s == editing) {
            return;
        }
    }
    for(int i …
Run Code Online (Sandbox Code Playgroud)

java swing jtable

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

javax.xml.bind的Base64编码器/解码器吃掉字符串的最后两个字符

我需要使用Base64编码转换一些字符串,并且很高兴看到我不必滚动我自己的转换器 - Java提供了一个javax.xml.bind.DataConverter.但是,它有一些问题.这是我使用Jython REPL的时间输出:

>>> import javax.xml.bind.DatatypeConverter as DC
>>> import java.lang.String as String
>>> def foo(text):
...   return DC.printBase64Binary(DC.parseBase64Binary(String(text)))
... 
>>> foo("hello")
'hell'
>>> foo("This, it's a punctuated sentence.")
'Thisitsapunctuatedsenten'
>>> foo("\"foo\" \"bar\"")
'foob'
>>> foo("\"foo\" \"bar\"12")
'foobar12'
>>> foo("\"foo\" \"bar\"1")
'foob'
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,它根本不处理非字母数字字符,并且经常 - 但不总是 - 将字符串截断两个字符.

我想这可能是时候编写我自己的类了,但是现在我很烦恼a)我没有读取javadoc或其他东西b)该类没有按预期工作.

所以任何帮助都非常感谢; 提前致谢.

java base64 encoding decoding

3
推荐指数
2
解决办法
2万
查看次数

WEKA用SimpleDateFormat解析我的约会....除非它涉及2点钟

我有一个大型的ARFF文件,其数据看起来像这样:

555,"2011-03-13 01:50:48.000",0
540,"2011-03-13 02:10:19.000",0
Run Code Online (Sandbox Code Playgroud)

为了帮助解析它,我声明了第二个属性:

@attribute RecordedOn date "yyyy-MM-dd HH:mm:ss.SSS"
Run Code Online (Sandbox Code Playgroud)

使用Java的SimpleDateFormat的解析器适用于第一行(以及与它非常相似的几百万行),但是在几行上扼流,就像第二行一样.我注意到它只扼杀了一行其小时为"02"的行 - 实际上,如果将其更改为第二行则解析得很好540,"2011-03-13 01:10:19.000",0.为了增加这个谜团,一些带有a的行02无论如何都被解析了.喜欢:1,"2006-12-16 02:58:51.000",111

那么有谁知道发生了什么?有什么建议?提前致谢.

java simpledateformat weka arff

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

Jasmine在测试之前调用

我正在写一个Rails应用程序,它具有以下茉莉花规格:

describe "buttons", ->

  beforeEach ->
    loadFixtures("foo.html")
    alert("beforeEach: " + $("tr.foo").length)

  describe ".hide_foo", ->
    alert(".hide-foo: " + $("tr.foo").length)
    ...
    expect($("tr.foo")).toBeHidden()
Run Code Online (Sandbox Code Playgroud)

规范因错误而失败:

TypeError: Cannot call method 'expect' of null
Run Code Online (Sandbox Code Playgroud)

所以我提出警报.首先我们看到".hide-foo:0",然后在我关闭之后"beforeEach:44"出现.很明显错误是因为我们在expect加载夹具之前调用了但是......为什么在每个例子之前没有beforeEach执行heck ?

我正在使用jasminerice来使用Rails Asset Pipeline来编译我的Coffeescript.版本:

$ bundle show jasmine && bundle show jasminerice
/home/tmacdonald/.rvm/gems/ruby-1.9.2-p320/gems/jasmine-1.2.0
/home/tmacdonald/.rvm/gems/ruby-1.9.2-p320/gems/jasminerice-0.0.9
Run Code Online (Sandbox Code Playgroud)

谢谢!

javascript unit-testing coffeescript jasmine

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

将nil视为通配符类型

我正在写一个Lisp程序,并试图对类型有点认真.我想有性能改进,但我更感兴趣的是使用类型注释来提高文档和安全性.问题是nil.到目前为止我遇到了两个问题.

图表A:

>(defmethod foo ((bar bar-class) (quux quux-class))
   ...)

>(foo (make-instance 'bar-class) nil)
 ERROR: No applicable method, etcetera etcetera, because nil is not of type quux-class
Run Code Online (Sandbox Code Playgroud)

图表B:

(defmethod initialize-instance :after ((f foo) &rest args)
  "Initialize the grid to be the right size, based on the height and width of the foo."
  (declare (ignorable args))
  (setf (slot-value f 'grid) (make-array (list (width f) (height f))
                                         :element-type 'foo-component
                                         :adjustable nil
                                         :initial-element nil)))

style-warning: 
  NIL is not a FOO-COMPONENT.
Run Code Online (Sandbox Code Playgroud)

这里的最佳做法是什么?到目前为止,我所拥有的唯一具有远程洞察力的想法是使用空对象模式 …

lisp types common-lisp clos

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