设计:登录时关联记录

时间:2017-09-16 16:00:18

标签: ruby-on-rails devise associations

我添加了一个自定义设备会话控制器,用于在有人登录后关联记录:

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

以下是请求参数:

Parameters: {"utf8"=>"✓", "authenticity_token"=>"JOQQcCTB9tkVegDgHP/ww8hu5qSzNWlu+4HZZ9AmQGYVO60f3BliwEYT+HKAGPsOOqbipSgj/xSqcDLqueOPZw==", "user"=>{"calculation_id"=>"48759708645478633", "email"=>"jonas@slooob.com", "password"=>"[FILTERED]", "remember_me"=>"0"}, "commit"=>"Signin"}

我还在attr_accessor :calculation_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

这也不起作用。

1 个答案:

答案 0 :(得分:1)

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可能不是你想要的。也许您应该寻找current_user.id?或者此时登录的用户对象的名称。此外,如果您更喜欢使用模型关系,那么可能类似

c.user = current_user
c.save

以上都认为你有正确的关联,例如:用户has_many计算和计算belongs_to用户,并且您的数据库反映了这一点。我这样说是因为你提到了:

  

我还将attr_accessor:calculation_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