Ruby on rails 设计:登录时关联记录
有人登录后,我添加了一个自定义Desive sessions controller来关联记录:Ruby on rails 设计:登录时关联记录,ruby-on-rails,devise,associations,Ruby On Rails,Devise,Associations,有人登录后,我添加了一个自定义Desive sessions controller来关联记录: class SessionsController < Devise::SessionsController before_create :associate_calculation def associate_calculation Calculation.find(self.calculation_id).user_id = self.id
class SessionsController < Devise::SessionsController
before_create :associate_calculation
def associate_calculation
Calculation.find(self.calculation_id).user_id = self.id
Calculation.last.save!
end
end
我还将attr\u accessor:calculation\u id
添加到User
模型中
但是,相应的计算不会与登录用户关联
我还尝试手动将计算附加到用户:
class SessionsController < Devise::SessionsController
before_create :associate_calculation
def associate_calculation
Calculation.last.user_id = User.first.id
Calculation.last.save!
end
end
class sessioncontroller
这也不管用
def associate_calculation
c = Calculation.find(self.calculation_id)
c.user_id = self.id #self.id is probably also wrong. maybe current_user?
#Calculation.save! You can not save a class. You need to save an instance
c.save
end
保存对象而不是类。您应该有一个错误,所以还要通过向日志文件添加跟踪并检查输出来确保该方法实际上正在被调用
我还怀疑self.id可能也不是您想要的。也许您应该查找当前的_user.id?或者无论当前登录的用户对象的名称是什么。另外,如果您更喜欢使用模型关系,那么可能类似
c.user = current_user
c.save
以上假设您有正确的关联,例如用户有许多计算,计算属于用户,并且您的数据库反映了这一点。我这样说是因为你提到:
我还将attr\u accessor:calculation\u id添加到用户模型中
这显然是错误的,不会给你想要的结果,所以看起来你有点困惑
仅仅向模型中添加一个方法根本不会有任何效果。即使它确实有效,您的解决方案也只允许用户进行一次计算,而您的代码意味着您将进行许多计算。
这让我想到,你不应该只是在寻找一个计算,而应该创建一个
你把路线安排好了吗?要使扩展控制器生效,您需要以下内容
class SessionsController < Devise::SessionsController
def destroy
reset_session
super
end
end
# In your routes
devise_for :users do
get "/users/sign_out", :to => "sessions#destroy", :as => "destroy_user_session"
end
class sessioncontroller“sessions#destroy”,:as=>“destroy_user_session”
结束
问题似乎是,associate\u calculation
一开始没有被调用。@jonhue这可以解释为什么您没有看到代码中的错误。所以,当你得到排序,不同的问题?然后使用上面的方法,你应该得到你想要的结果result@jonhue我已经相当地更新了我的答案。希望它能帮助您找到实际需要的解决方案我只向用户添加了attr\u accessor
,因为它允许我向singin表单添加计算id(来自参数)。我的目标是相应地设置计算的user\u id
列。关联(has_many/belish_to)是按照您的预期设置的。@jonhue很好,您已经正确设置了关联。我的困惑在于attr_访问器。也许更好的解决方案是设置一个全局变量@calculation
,以表示控制器操作中所需的计算对象,然后在需要时可以访问该对象,而不是添加属性访问器?这是正常的做法
class SessionsController < Devise::SessionsController
def destroy
reset_session
super
end
end
# In your routes
devise_for :users do
get "/users/sign_out", :to => "sessions#destroy", :as => "destroy_user_session"
end