0

有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

那我做错了什么谢谢?

4

2 回答 2

1

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

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

无论哪种方式,问题都@current_user没有在任何地方设置。

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

于 2013-10-29T14:15:27.390 回答
1

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

#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
于 2013-10-29T14:23:12.560 回答