【问题标题】:Can't find user without ID - form error in Rails 3 project找不到没有 ID 的用户 - Rails 3 项目中的表单错误
【发布时间】:2012-04-18 20:07:43
【问题描述】:

我在 Gumtree.com 之类的网站上工作,用户在该网站上创建帖子,突出他们的各种需求(例如,我在第 X 天需要一名摄影师)。

消息功能出现问题。我正在使用简单的私人消息传递插件。

问题在于用户填写发送消息/回复帖子的表单。当我尝试访问 /messages/new 时出现以下错误:

ActiveRecord::RecordNotFound in MessagesController#new
Couldn't find User without an ID

在下面附上我的模型 - 感谢您的任何建议!

谢谢,

费萨尔

消息控制器

class MessagesController < ApplicationController

before_filter :set_user

def index
if params[:mailbox] == "sent"
  @messages = @user.sent_messages
else
  @messages = @user.received_messages
end
end

def show
@message = Message.read_message(params[:id], current_user)
end

def new
@message = Message.new

if params[:reply_to]
  @reply_to = @user.received_messages.find(params[:reply_to])
  unless @reply_to.nil?
    @message.to = @reply_to.sender.login
    @message.subject = "Re: #{@reply_to.subject}"
    @message.body = "\n\n*Original message*\n\n #{@reply_to.body}"
  end
end
end

def create
@message = Message.new(params[:message])
@message.sender = @user
@message.recipient = User.find_by_login(params[:message][:to])

if @message.save
  flash[:notice] = "Message sent"
  redirect_to user_messages_path(@user)
else
  render :action => :new
end
end

def delete_selected
if request.post?
  if params[:delete]
    params[:delete].each { |id|
      @message = Message.find(:first, :conditions => ["messages.id = ? AND (sender_id = ? OR recipient_id = ?)", id, @user, @user])
      @message.mark_deleted(@user) unless @message.nil?
    }
    flash[:notice] = "Messages deleted"
  end
  redirect_to :back
end
end

private
def set_user
  @user = User.find(params[:user_id])
end
end

消息模型

class Message < ActiveRecord::Base

is_private_message

attr_accessor :to

end

用户模型

class User < ActiveRecord::Base

has_many :posts  
has_one :profile
has_private_messages

attr_accessible :email

validates_presence_of :email
validates_uniqueness_of :email, :message =>"Hmm, that email's already taken"
validates_format_of :email, :with => /^([^\s]+)((?:[-a-z0-9]\.)[a-z]{2,})$/i, :message => "Hi! Please use a valid email"


end

消息>新视图

<% form_for @message, :url => user_messages_path(@user) do |f| %>
<p>
To:<br />
    <%= f.text_field :to %>
    <%= error_message_on @message, :to %>
</p>
<p>
Subject:<br />
<%= f.text_field :subject %>
<%= error_message_on @message, :subject %>
</p>
<p>
  Message<br />
  <%= f.text_area :body %>
        <%= error_message_on @message, :body %>
</p>
<p>
  <%= submit_tag "Send" %>
</p>
<% end %>

【问题讨论】:

  • 您还记得您是如何解决这个问题的吗?我正在使用与您相同的插件并且遇到相同的问题。我尝试将@user 设置为 User.first、User.find(1) 等,但到目前为止没有运气。

标签: ruby-on-rails ruby-on-rails-3 forms


【解决方案1】:

您确定您的新消息页面会收到:user_idparams 吗?即使这是真的,我怀疑这是你的意图,因为任何人都可以通过传递另一个 :user_id 来假装是另一个用户。

所以你的行在底部:

@user = User.find(params[:user_id]) # I think it's the cause of your error -- no :user_id is passed

似乎必须是:

@user = User.find(session[:user_id])

我想你听说过会话。

【讨论】:

  • 只是简单的更换不会解决您的问题。尝试测试:将任何有效的 id 传递给这个 find() 方法,看看你的操作是否有效。如果是这样 - 你一开始就没有通过:user_id
  • 只需将@user = User.find(params[:user_id]) 替换为@user = User.first
猜你喜欢
  • 1970-01-01
  • 2019-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多