Ruby on rails 未定义的方法`sender_id=';零级:零级

Ruby on rails 未定义的方法`sender_id=';零级:零级,ruby-on-rails,Ruby On Rails,目前,我正在使用Rails创建一个类似snapchat的应用程序。我得到一个错误: nil:NilClass的未定义方法'sender_id=' 当我试图提交新的消息表单时,我真的不知道我在哪里犯了错误。此外,我不确定my messages_controller中创建操作的逻辑,基本上我只希望发件人通过同时选择一个或多个收件人向其好友列表中的人发送消息(当然,收件人必须在其好友列表中,我已经完成了此功能)。但是,因为我还没有弄清楚如何将参数recipient_id传递给表单(我使用的是简单表单g

目前,我正在使用Rails创建一个类似snapchat的应用程序。我得到一个错误:

nil:NilClass的未定义方法'sender_id='

当我试图提交新的消息表单时,我真的不知道我在哪里犯了错误。此外,我不确定my messages_controller中创建操作的逻辑,基本上我只希望发件人通过同时选择一个或多个收件人向其好友列表中的人发送消息(当然,收件人必须在其好友列表中,我已经完成了此功能)。但是,因为我还没有弄清楚如何将参数recipient_id传递给表单(我使用的是简单表单gem,顺便说一下design gem),所以我在create操作中硬编码了recipient_id。因此,欢迎所有建议/建议。 这是我的档案:

消息\u controller.rb

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

  def create
    @message.sender_id = current_user
    @message.recipient_id = current_user.friendships.friend_id
    @message = Message.new(message_params)
    if @message.save?
      flash[:success] = 'Message sent successfully'
      redirect_to welcome_profile_path
    else
      render 'new'
    end
  end

  private

    def message_params
      params.require(:message).permit(:body, :sender_id, :recipient_id, :user_id)
    end
end
<h1>Create New Message</h1>

<%= simple_form_for @message do |f| %>
  <%= f.input :body %>
  <%#= f.association :user, :as => :hidden, :input_html => { :value => current_user.id }, :include_blank => false %>
  <%= f.button :submit, "Send Message", class: "btn btn-secondary" %>
<% end %>
class Message < ActiveRecord::Base
  belongs_to :user, foreign_key: :recipient_id

  belongs_to :sender, :foreign_key => :sender_id, class_name: 'User'
  belongs_to :recipient, :foreign_key => :recipient_id, class_name: 'User'

  validates_presence_of :body

end
class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable
  validates :username,
  :presence => true,
  :uniqueness => {
    :case_sensitive => false
  }

  validate :validate_username

  def validate_username
    if User.where(email: username).exists?
      errors.add(:username, :invalid)
    end
  end

  has_many :friendships
  has_many :friends, :through => :friendships
  has_many :inverse_friendships,  :class_name => "Friendship", :foreign_key => "friend_id"
  has_many :inverse_friends, :through => :inverse_friendships, :source => :user

  has_many :messages, dependent: :destroy

end
ActiveRecord::Schema.define(version: 20160316170009) do

  # These are extensions that must be enabled in order to support this database
  enable_extension "plpgsql"

  create_table "friendships", force: :cascade do |t|
    t.integer  "user_id"
    t.integer  "friend_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

  create_table "messages", force: :cascade do |t|
    t.text     "body"
    t.boolean  "read"
    t.integer  "sender_id"
    t.integer  "recipient_id"
    t.integer  "user_id"
    t.datetime "created_at",   null: false
    t.datetime "updated_at",   null: false
  end

  add_index "messages", ["user_id"], name: "index_messages_on_user_id", using: :btree

  create_table "users", force: :cascade do |t|
    t.string   "email",                  default: "", null: false
    t.string   "encrypted_password",     default: "", null: false
    t.string   "reset_password_token"
    t.datetime "reset_password_sent_at"
    t.datetime "remember_created_at"
    t.integer  "sign_in_count",          default: 0,  null: false
    t.datetime "current_sign_in_at"
    t.datetime "last_sign_in_at"
    t.inet     "current_sign_in_ip"
    t.inet     "last_sign_in_ip"
    t.datetime "created_at",                          null: false
    t.datetime "updated_at",                          null: false
    t.string   "username"
  end

  add_index "users", ["email"], name: "index_users_on_email", unique: true, using: :btree
  add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true, using: :btree
  add_index "users", ["username"], name: "index_users_on_username", unique: true, using: :btree

  add_foreign_key "messages", "users"
end

该错误是因为在
创建
操作中设置
@message.sender\u id
之前没有定义
@message
。在设置
@message.sender\u id
之前,将
@message=message.new(message_参数)
移动到
创建
操作的顶部,如下所示:

class MessagesController < ApplicationController
  ...

  def create
    @message = Message.new(message_params)

    @message.sender_id = current_user
    @message.recipient_id = current_user.friendships.friend_id
    if @message.save?
      flash[:success] = 'Message sent successfully'
      redirect_to welcome_profile_path
    else
      render 'new'
    end
  end

  private

    def message_params
      params.require(:message).permit(:body, :sender_id, :recipient_id, :user_id)
    end
end
通过以上设置,您的
创建
操作可以更新为:

 # app/controllers/messages_controller.rb

 def create
    @message = Message.new(message_params)
    @message.sender_id = current_user

    if @message.save?
      flash[:success] = 'Message sent successfully'
      redirect_to welcome_profile_path
    else
      render 'new'
    end
  end

谢谢你详细的回答。现在我可以发送消息了,但我表单中的下拉菜单没有显示收件人的姓名(我的用户表中的用户名列),而是显示如下内容:#:0x007f00d85581f8>。此外,它还显示了我数据库中的所有用户。我只想让它显示发件人的好友列表中的人。我在messages_controller中的逻辑是否有问题?请阅读哪些应该指导您如何设置集合,以及在选择选项中使用什么值显示什么。
 # app/controllers/messages_controller.rb

 def create
    @message = Message.new(message_params)
    @message.sender_id = current_user

    if @message.save?
      flash[:success] = 'Message sent successfully'
      redirect_to welcome_profile_path
    else
      render 'new'
    end
  end