我一直在尝试让我的第一个 Rails 代码运行一段时间,但我似乎仍然无法让它运行。我最近的问题是我不断收到以下错误
'NoMethodError in MessageController#create".
我看到我正在尝试为某些变量传递 nil,如下一行所示
"undefined method `message' for #<Message mess: nil, user: nil>"
但是,正如我在错误屏幕底部看到的那样,我的参数已正确传递。我的代码如下。感谢您的帮助。
Controller
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
查看
<%= form_for @message, url: {action: "create"}, html: {class: "nifty_form"} do |f| %>
<%= f.text_field :mess %><br />
<%= f.text_field :user %><br />
<%= f.submit "Create" %>
<% end %>
最佳答案
强参数
首先,您需要阅读 Strong Parameters
在 Rails 4 中,为了防止批量分配,您需要使用私有(private)方法创建新的 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
这将从这个参数散列中为您的 ActiveRecord 对象设置参数:
params {
"message" => {
"mess" => "value",
"user" => "value"
}
}
这应该按原样由您的表单传递;但是,如果您开始使用类似 form_tag
的东西,您最终将没有 message
参数,从而阻止强参数方法正常工作。
--
表格
您的表单可以简化:
<%= form_for @message, html: {class: "nifty_form"} do |f| %>
如果您填充 form_for
with an ActiveRecord object , Rails 应该会自动为你提取路径;这对您的错误并不重要,因为您的表单无论如何都会将请求发送到 create
操作
--
方法
无方法错误
源自对不存在或不支持该方法的对象调用方法(毫不奇怪)。
关于调试这个问题,您基本上需要寻找您可能在对象上调用 .message
的位置。这通常在 View 或其他东西中(如果不在 Controller 中)
只有在 strong params
方法中引用了 .message
,我建议您试试这个:
def create
@message = Message.new(user_params)
if @message.save
redirect_to "http://itworks.com"
else
redirect_to "http://myspace.com"
end
这将使 Action 变得常规,这应该给它最好的工作机会。
--
关联
您可能遇到的另一个问题是 Message
模型中的 ActiveRecord 关联。 ActiveRecord 关联在模型中定义,使您的对象能够附加关联数据
您遇到的错误可能来自这样的事情:
#app/models/message.rb
Class Message < ActiveRecord::Base
belongs_to :message #-> won't work
end
关于ruby-on-rails - Rails 未定义的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24463285/