ruby-on-rails - Rails 未定义的方法

标签 ruby-on-rails ruby

我一直在尝试让我的第一个 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/

相关文章:

ruby-on-rails - 使用 Rapns 发送通知,我在 Ubuntu 和 Mac 上收到 SSL 错误

ruby-on-rails - Rails 2 到 Rails 3 : using link_to instead of link_to_remote (including remote and update)

ruby-on-rails - Rails select_tag onchange ajax 请求

ruby-on-rails - Rails 4 中的嵌套表单未在 View 中呈现

ruby-on-rails - Ruby 是否存在 C1 代码覆盖率分析?

ruby - 如何测量 cucumber 步骤的执行时间

ruby - "pythonic"的 Ruby 等价物是什么?

ruby-on-rails - 如何使用 Ruby 2.5.3 从数组中删除字符串?

javascript - 当我们想要选择具有动态ID的对象时,如何在coffescript jquery中使用ruby代码?

javascript - 将 Highcharts 与 Rails 6 结合使用