Rails未定义的方法

我一直试图让我的第一个Rails代码工作一段时间,我似乎仍然无法让它工作。 我最近的问题是我不断收到以下错误

‘MessageController中的NoMethodError #create“。

我看到我试图为一些变量传递nil,如下一行所示

"undefined method `message' for #" 

但是我的参数正确传递,正如我在错误屏幕底部看到的那样。 我的代码如下。 任何帮助表示赞赏。

调节器

 class MessageController < ApplicationController def new @message = Message.new end def create @message = Message.new(user_params) @message.mess=params[:mess] @message.user=params[:user] if @message.save redirect_to "http://itworks.com" else redirect_to "http://myspace.com" end end private def user_params params.require(:message).permit(:mess, :user) end end 

视图

  

强参数

首先,您需要阅读Strong Parameters

使用Rails 4,为了防止质量分配,您需要使用私有方法创建新的ActiveRecord对象以分配所需的参数值:

 #app/controllers/messages_controller.rb Class MessagesController < ApplicationController def create @message = Message.new(message_params) @message.save end private def message_params #-> you can call this method what you like :) params.require(:message).permit(:mess, :user) end end 

这将从此params哈希设置ActiveRecord对象的参数:

 params { "message" => { "mess" => "value", "user" => "value" } } 

应该通过你的表格传递; 但是,如果你开始使用像form_tag这样的东西,你最终会没有message参数,从而阻止强params方法正常工作。

形成

您的表单可以简化:

 <%= form_for @message, html: {class: "nifty_form"} do |f| %> 

如果使用ActiveRecord对象填充form_for ,Rails应自动为您提取路径; 并不重要的是你的错误,因为你的表单无论如何都要将请求发送到create操作

方法

no method error来自于调用对象上的方法,该方法不存在,或者不支持该方法(不出所料)。

关于调试此问题,您基本上需要查找可能在对象上调用.message的位置。 这通常是在一个视图或某事(如果不在控制器中)

只有.message在你的strong params方法中的引用,我建议尝试这个:

  def create @message = Message.new(user_params) if @message.save redirect_to "http://itworks.com" else redirect_to "http://myspace.com" end 

这将使行动变得传统,这应该给它最好的工作机会。

协会

您可能遇到的另一个问题是Message模型中的ActiveRecord关联。 ActiveRecord关联在模型中定义,以使您的对象能够附加关联数据

您遇到的错误可能来自以下内容:

 #app/models/message.rb Class Message < ActiveRecord::Base belongs_to :message #-> won't work end 

您有几个命名问题:

 class MessagesController < ApplicationController #Primarily, you want MessagesController, not MessageController. Plural. def new @message = Message.new end def create #you should call 'message_params' not 'user_params' as a #parameter in your call to Message.new @message = Message.new(message_params) # these two lines need to be commented out, as they overwrite the attributes # in @message with nil # @message.mess=params[:mess] # @message.user=params[:user] if @message.save redirect_to "http://itworks.com" else redirect_to "http://myspace.com" end end private #again, message_params, because these are the params that are permitted via #a form to the message controller (and therefore model), though this wasn't #technically a problem. You can name your methods anything you want in Ruby. #this name is just clearer. def message_params params.require(:message).permit(:mess, :user) end end 

您可以在调用form_for时删除:url => {:action =>'create'},因为新记录将始终路由到由f.submit创建。 这允许您使用相同的表单进行编辑和创建。