Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 设计:登录时关联记录_Ruby On Rails_Devise_Associations - Fatal编程技术网

Ruby on rails 设计:登录时关联记录

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

有人登录后,我添加了一个自定义Desive sessions controller来关联记录:

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