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创建。 这允许您使用相同的表单进行编辑和创建。