而不是创建记录,find_or_create_by
只是返回nil
。而且我不确定为什么。
我这样做:
current_store.jet.find_or_create_by(seller_id: seller_id) do |credentials|
credentials.update_attributes(
marketplace: marketplace,
seller_id: seller_id,
auth_token: auth_token)
end
它会返回此信息,而不是出于某种原因创建记录:
*** NoMethodError Exception: undefined method `find_or_create_by' for nil:NilClass
我已经检查了所有参数并且它们是正确的。但是确定还没有jet
实例,但这就是重点。
My Jet表格如下:
create_table "jets", force: :cascade do |t|
t.text "auth_token"
t.text "marketplace"
t.integer "store_id"
t.boolean "three_speed"
t.text "seller_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
我的current_store
方法看起来像这样,并且正在返回正确的商店。
def current_store
@current_store ||= Store.find(session[:fba_shipping_id])
end
我哪里误入歧途?
编辑: 以下是关于这些关系的更多信息..
class Store < ActiveRecord::Base
has_one :jet
end
和
class Jet < ActiveRecord::Base
belongs_to :store
end
答案 0 :(得分:2)
由于你有一个has_one
关联,所以编写方法可能更清楚如下:
Jet.find_or_create_by(store_id: current_store.id) do |jet|
jet.seller_id = seller_id
jet.marketplace = marketplace
jet.auth_token = auth_token
end
在我看来,这将完成你想要做的事情,但是以更标准的方式。
请注意,这不会更新现有seller_id
的属性(marketplace
,auth_token
,jet
),但会创建具有这些属性的属性(如果current_store
尚未分配jet
。
即使记录已存在,您是否要更新这些属性?
答案 1 :(得分:1)
您目前的问题是
dmanna@ubuntu:~$ sudo pip install --no-index --find-links=pyt/pkg/patroni-1.4.4.tar.gz patroni[zookeeper]
Ignoring indexes: https://pypi.python.org/simple/
Downloading/unpacking patroni[zookeeper]
Running setup.py (path:/tmp/pip_build_root/patroni/setup.py) egg_info for package patroni
Installing extra requirements: 'zookeeper'
Downloading/unpacking urllib3>=1.19.1,!=1.21 (from patroni[zookeeper])
Could not find any downloads that satisfy the requirement urllib3>=1.19.1,!=1.21 (from patroni[zookeeper])
Cleaning up...
No distributions at all found for urllib3>=1.19.1,!=1.21 (from patroni[zookeeper])
Storing debug log for failure in /home/dmanna/.pip/pip.log
返回current_store.jet
,因此nil
。
如果商店只有1 NoMethodError
,那么Jet
也只能拥有1 Store
中的1 Seller
。
Jet
(Documentation)提供了构建器方法has_one
和build_association
,因此您可以使用
create_association
但是,您可能需要确保current_store.create_jet(marketplace: marketplace,
seller_id: seller_id,
auth_token: auth_token)
还没有Store
,例如
Jet
如果@HeliosdeGuerra在评论中指出您的意图,则不会更新现有的@jet = current_store.jet || current_store.create_jet(marketplace: marketplace,
seller_id: seller_id,
auth_token: auth_token)
。如果您真的想要使用这些方法并更新现有的Jet
,那么您可以使用类似的东西:
Jet
但是,在这两种情况下,您应确保@jet = current_store.jet || current_store.create_jet(seller_id: seller_id)
@jet.update_attributes(marketplace: marketplace,auth_token: auth_token)
已通过验证,例如
Jet