【问题标题】:Change instance attribute in model更改模型中的实例属性
【发布时间】:2013-11-08 17:50:50
【问题描述】:

rails 约定“Skinny Controllers Fat Models”,我试图遵循它, 到目前为止,在我的控制器中:

   def create
    @message = Message.new(message_params)

    @message.sender_username = @current_user.username
    @message.sender_model = @current_user.class.to_s
    @message.sender_id = @current_user.id

    if @message.sender_model == "Department"
      @current_user.update_column(:gelesen, @current_user.employees.map { |s| "#{s.username}" }.join(','))
    else
      @current_user.update_column(:gelesen, @message.recipient_username)
    end
    ....

所以现在我尝试将其中一些代码移动到我的模型中(我尝试了几件事,但这里是一个尝试:)

class Message < ActiveRecord::Base
    before_save :set_sender, :add_gelesen

    def set_sender
        sender_username = @current_user.username
        sender_model = @current_user.class.to_s
        sender_id = @current_user.id
    end

    def add_gelesen
        if @message.sender_model == "Department"
           @current_user.update_column(:gelesen, @current_user.employees.map { |s| "#{s.username}" }.join(','))
        else
          @current_user.update_column(:gelesen, @message.recipient_username)
        end
    end

end

然后我得到错误:

  undefined method `username' for nil:NilClass

那我做错了什么谢谢?

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3


    【解决方案1】:

    您确定将@current_user 设置为任何内容吗? @current_user 通常在与 Devise 等用户管理 gem 结合使用时设置。如果您启动了会话,该功能通常会像这样工作:

    def current_user
      @current_user ||= User.find(session[:user_id])
    end
    

    不管怎样,问题是@current_user 没有在任何地方设置。

    其次,我不确定您是否正确使用了update_column。这主要用于更新数据库上的表。您更有可能想要使用#update_attributes (http://apidock.com/rails/ActiveResource/Base/update_attributes) 之类的东西。

    【讨论】:

      【解决方案2】:

      您可以像这样轻松地将代码从控制器移动到模型:

      #controller
      def create
        Message.create_with_sender(message_params, @current_user)
      end
      
      #model 
      class Message < ActiveRecord::Base
      
        def self.create_with_sender(params, user)
          message = new(params)
          message.sender_username = user.username
          message.sender_model = user.class.to_s
          message.sender_id = user.id
          if message.sender_model == "Department"
             user.update_column(:gelesen, user.employees.map { |s| "#{s.username}" }.join(','))
          else
            user.update_column(:gelesen, message.recipient_username)
          end
          message.save
        end
      
      end
      

      【讨论】:

      • 没有使用 before_save 或 before_validation 的解决方案吗?
      • 现在我尝试了this.sender_username = @current_user.username,但随后我得到了错误 undefined local variable or method `this' for #<0x857eab8>
      猜你喜欢
      • 1970-01-01
      • 2021-01-04
      • 2014-09-27
      • 2013-12-07
      • 2019-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多