0

私は行為をメッセージ可能な宝石として使用しようとしており、彼らのサンプルコントローラーに従っています

解決済み 回答を参照

ビューでメッセージを送信しようとすると、このエラーundefined method `send_message' for nil:NilClassが発生し続けます

コードをどのように調整すればよいですか? ありがとう

ビュー (フォーム)

            <%= simple_form_for ActsAsMessageable::Message.new, :url => messages_path, :method => :post do |f| %>
                <%= f.hidden_field :to, value: @gear.user.email %>
                <%= f.input :body %>
                <%= f.input :topic %>
                <%= f.button :submit, class: 'btn' %>
            <% end %>

ユーザーモデル

class User < ActiveRecord::Base 
  acts_as_messageable :table_name => "messages",                         # default 'messages'
                      :required   => [:topic, :body],                     # default [:topic, :body]
                      :class_name => "ActsAsMessageable::Message",       # default "ActsAsMessageable::Message",
                      :dependent  => :nullify                            # default :nullify

end

メッセージコントローラー

class MessagesController < ApplicationController
  def new
    @message = ActsAsMessageable::Message.new
  end

  def create
    @to = User.find_by_email(params[:acts_as_messageable_message][:to])
    current_user.send_message(@to, params[:acts_as_messageable_message][:topic], params[:acts_as_messageable_message][:body])
  end
end

開発ログ

Started POST "/messages" for 127.0.0.1 at 2012-11-15 07:23:40 -0600
Processing by MessagesController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"OqaDOP6PldbFVXWPZyijn+887Ym/fDsU0oqzVrL0rQA=", "acts_as_messageable_message"=>{"to"=>"xyz@test.com", "body"=>"test", "topic"=>"test"}, "commit"=>"Create Message"}
  [1m[35mUser Load (0.5ms)[0m  SELECT `users`.* FROM `users` WHERE `users`.`email` = 'xyz@test.com' LIMIT 1
Completed 500 Internal Server Error in 3ms

NoMethodError (undefined method `send_message' for nil:NilClass):
  app/controllers/messages_controller.rb:29:in `create

'

4

2 に答える 2

1

エラーメッセージと提供されたコードから、 params obj が思ったようにフォーマットされていないようです。params[:acts_as_messageable_message]の代わりに試してみてください[:message]。それでもうまくいかない場合は、ログをチェックして、params として渡されているものを確認してください。

于 2012-11-15T06:59:41.273 に答える
0

私はそれを機能させることになりました。最終的に問題となったのは、gem が User モデルを使用しており、コントローラーが「Messages」と呼ばれる別のコントローラーではなく User コントローラーであることを期待していたことです。したがって、アクションを Users コントローラーに移動し、ルートを追加し、ビュー パスを変更しただけで、機能するようになりました。@Alex.Bullard 助けてくれてありがとう。

私は以下の編集を投稿しています:

コントローラーチェンジ

class UsersController < ApplicationController
  respond_to :html, :json
  def new_message
    @message = ActsAsMessageable::Message.new
  end

  def create_message
    @to = User.find_by_email(params[:acts_as_messageable_message][:to])
    current_user.send_message(@to, params[:acts_as_messageable_message][:topic], params[:acts_as_messageable_message][:body])
    redirect_to :back, notice: "Message sent to Owner"
  end

end

意見

            <%= simple_form_for ActsAsMessageable::Message.new, :url => create_message_users_path, :method => :post do |f| %>
                <%= f.hidden_field :to, value: @gear.user.email %>
                <%= f.input :body %>
                <%= f.input :topic %>
                <%= f.button :submit, class: 'btn' %>
            <% end %>

ルート

  resources :users, :except => [ :create, :new ] do
     get "new_message", :on => :collection
     post "create_message", :on => :collection
     resources :store
  end
于 2012-11-15T14:15:09.870 に答える