0

Rails 3プロジェクトでフォームを送信しようとすると、次のエラーが発生します。このフォームは、1人のユーザーがSimplePrivateMessagingプラグインを使用して別のユーザーにメッセージを送信するときに使用されます。

私が今サイトを設定した方法では、ユーザーはメッセージを送信するためにサインアップまたはログインする必要はありません。

私が得ているエラー

NoMethodError in MessagesController#create

undefined method `find_by_login' for #<Class:0x12a374238>

app/controllers/messages_controller.rb:33:in `create'

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

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

メッセージ>新しいビュー(ここでフォームが作成されます)

<%= form_for @message, :url => messages_path(:user_id => @user) do |f| %>
<br>
<br />
<br />
<div class="field">
Hello! My name is <%= f.text_field :subject %> and I'm contacting you in response to your ad. I'm interested in learning more so get in touch! Here's my contact details: <%= f.text_field :body %>.
</div>
<button type="submit" class="btn span6 large">Submit</button>
<% 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

ユーザーの移行

class CreateUsers < ActiveRecord::Migration
def change
create_table :users do |t|
  t.string :email
  t.string :salt
  t.timestamps
end
end
end

ログインによるユーザーの検索に関するRailsコンソールの出力

>> u = User.first
User Load (1.0ms)  SELECT "users".* FROM "users" LIMIT 1
=> nil
>> u.login
NoMethodError: undefined method `login' for nil:NilClass
from /Library/Ruby/Gems/1.8/gems/activesupport-3.1.1/lib/active_support/whiny_nil.rb:48:in `method_missing'
from (irb):2
>> 

ROUTES.RB

Mysalary::Application.routes.draw do

resources :users do
 resources :messages
   end

resources :profiles
resources :pages
resources :posts

get "pages/home"
get "pages/about"
get "pages/legal"
get "pages/feedback"

root :to => 'posts#new'

end
4

2 に答える 2

7

find_by_attribute(あなたの場合)は、 DBテーブル(あなたの場合はテーブル)にfind_by_login呼び出された列がある場合にRailsによって追加される動的メソッドです。テーブルには列が含まれていないため、モデルには属性もメソッドもありません。loginusersusersloginUserloginfind_by_login

列があるのでemail、問題のある行をこれに置き換えてみてください

@message.recipient = User.find_by_email(params[:message][:to])
于 2012-04-22T18:06:12.960 に答える
1

コンソールで試してみる場合:

u = User.first
u.login

何がもらえますか?ユーザーモデルにログイン属性がなく、メール属性があるようです。find_by_emailしたがって、代わりに使用する必要があります。

于 2012-04-22T16:16:21.777 に答える