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
    ....

だから今、私はこのコードのいくつかを私のモデルに移そうとしました(私はいくつかのことを試しましたが、ここに1つの試みがあります:)

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_attributes( http://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 に答える