2012-04-21 106 views
1

我收到以下錯誤,當我嘗試提交表單(形式顯示出來時,1個用戶想要消息的另一個用戶)未定義的方法`stringify_keys'的消息控制器

NoMethodError in MessagesController#create 

undefined method `stringify_keys' for "":String 
Rails.root: /Users/fkhalid2008/loand 

Application Trace | Framework Trace | Full Trace 
app/controllers/messages_controller.rb:31:in `new' 
app/controllers/messages_controller.rb:31: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 

我該如何解決這個問題?

更多個支持代碼如下:

MESSAGES>(這是其中正在創建表)NEW VIEW

<%= form_for @message, :url => messages_path(:user_id => @user) do |f| %> 
<br> 
<br /> 
<br /> 
<div class="field"> 
<label>Name</label> 
<input type="text" name="name" id="contact_name" class="required" /> 
</div> 

<div class="field"> 
<label>Email</label> 
<input type="text" name="email" id="contact_email" class="required" /> 
</div> 

<div class="field"> 
<label>Subject</label> 
<input type="text" name="subject" id="contact_subject" class="required" /> 
</div> 

<div class="field"> 
<label>Message</label> 
<textarea name="message" rows="8" cols="25" id="contact_message" class="required max_len", max_length=1000 /></textarea> 
</div> 
<div class="btn"> 
<%= submit_tag 'Send Message' %> 
</div> 

<% 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 

帖子>索引視圖(這是表格被鏈接到)

<table class="table table-striped"> 
<tbody> 
<% @posts.each do |post| %> 
<tr> 
<td>I am a <%= post.title %> getting married in <%= post.job %> in <%= post.location %>, and looking for a <%= post.salary %>. My budget is <%= post.salary %>.</td> 
<td> <button class="btn" data-toggle="button" onClick="javascript:location.href = '/messages/new';" />Contact</button></td> 
<td><%= time_ago_in_words(post.created_at) %> ago.</td> 
<!--/. 
<td><%= link_to 'Show', post %></td> 
<td><%= link_to 'Edit', edit_post_path(post) %></td> 
<td><%= link_to 'Destroy', post, :confirm => 'Are you sure?', :method => :delete %></td> 
--> 
</tr> 
<% end %> 
</tbody> 
</table> 

發展LOG

Started POST "/messages" for 127.0.0.1 at Sun Apr 22 01:54:57 +0500 2012 
Processing by MessagesController#create as HTML 
Parameters: {"name"=>"faisal", "commit"=>"Send Message", "authenticity_token"=>"Qyww9hP6jLmqpQ+ua21FAk9vePju8Gpq39Gpaflf3wE=", "utf8"=>"\342\234\223", "subject"=>"testing", "message"=>"hello", "email"=>"[email protected]"} 
User Load (0.1ms) SELECT "users".* FROM "users" LIMIT 1 

Completed 500 Internal Server Error in 17ms 

NoMethodError (undefined method `stringify_keys' for "hello":String): 
app/controllers/messages_controller.rb:31:in `new' 
app/controllers/messages_controller.rb:31:in `create' 
+0

向我們展示您創建消息的窗體。 '@ user'出現在藍色之外... – jdoe 2012-04-21 20:22:49

+0

@jdoe請參閱上面的內容,我添加了表單和其他支持代碼 – hikmatyar 2012-04-21 20:33:08

+0

您確定您已經發布了正確的數據嗎?該日誌包含完全不同的一組參數。也許這是錯誤的形式?如果你試圖在沒有等號的情況下輸出它,你的表單是如何管理顯示自己的:'

jdoe 2012-04-21 21:08:53

回答

6

現在我明白了。你建立你在一個完全不一致的方式形成:

<%= form_for @message, :url => messages_path(:user_id => @user) do |f| %> 

然後:

<input type="text" name="name" id="contact_name" class="required" /> 

什麼導致你到該文本字段無關與消息的情況。最後一個標籤中是否提到message

解決方法很簡單:使用助手。

而不是你的標記:

<label>Name</label> 
<input type="text" name="name" id="contact_name" class="required" /> 

使用助手:

<%= f.label :name %> 
<%= f.text_field :name %> 

而且你的字段將變爲正確命名(如message[name]),你會在你的控制器正確params[:message]得到。當然,你可以手工製作,但實踐表明這不是最好的決定。

對每個其他字段重複此步驟。

+0

謝謝!!!非常感謝這一點,它確實解決了這個問題。 (儘管thilo在他的回答中指出,現在還有一些其他錯誤需要修復) – hikmatyar 2012-04-21 23:37:03

2

我猜發生的事情是params[:message] ISN Rails希望這是一個散列。你一定要遵循jdoe的建議並發表你的表格代碼b/c我會懷疑這是不對的。

此外,您可以在開發日誌中看到要發佈到應用的數據。發佈,以及。它看起來像這樣:

Started POST "/message" for 127.0.0.1 at 2012-04-19 16:49:22 -0400 
    Processing by MessagesController#create as HTML 
    Parameters: {"key"=>"value"} 

「參數」是你想要的。

+0

我在上面添加了開發日誌和表單代碼..請讓我知道你是否看到錯誤在哪裏..謝謝! – hikmatyar 2012-04-21 20:41:00

1

當您致電Message.new(params[:message])時,params[:message]需要是具有消息屬性的散列。在您的表單中,因此在您的文章中,如日誌文件所示,params[:message]是一個字符串。

變化

<textarea name="message" rows="8" cols="25" id="contact_message" class="required max_len", max_length=1000 /></textarea> 

<textarea name="message[message]" rows="8" cols="25" id="contact_message" class="required max_len", max_length=1000 /></textarea> 

或更好

<%= f.text_area :message, :rows => 9, :cols => 25, :class => "required max_len", :max_length => 1000 %> 

不過 - 有一噸在您的表單其他錯誤,你將很快會遇到的 - 例如,沒有message[to]參數,但您希望在控制器中有一個參數。我建議閱讀一些Rails教程,例如this one

+0

謝謝!!非常感謝。我在這種情況下得到了2個正確的答案(你的和jdoe),所以爲了公平我選擇了第一個......我的jdoe ......對不起! – hikmatyar 2012-04-21 23:36:19

相關問題