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