2014-06-28 165 views
3

我一直在试图让我的第一个Rails代码工作一段时间,而我仍然无法让它工作。我的最新的问题是,我不断收到以下错误Rails未定义的方法

在MessageController#

“NoMethodError创建”。

我看到,我试图通过零对一些变量,如图中的下一行

"undefined method `message' for #<Message mess: nil, user: nil>" 

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

控制器

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

你不应该做'Message.new (user_params)'*和*'mess = params [:mess]; user = params [:user]'。使用一个或另一个。就目前来看,你做错了第二项任务。 'params [:mess]'和'params [:user]'都是零,所以你只需用'user_params'覆盖你拉入的值。你后面的值在'params [:message]'里面,例如'params [:message] [:user]'。至于你的错误,我们需要看看模型。 – meagar

+0

你可以发布你的路线。 'routes.rb' –

回答

4

强参数

首先,你需要在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哈希:

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动作反正

-

方法

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

你有一对夫妇的命名问题:

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 

可以删除:URL => {:动作=> '创建'}上您对form_for的调用,作为新记录总是会被路由到f.submit创建。这使您可以使用相同的表单进行编辑和创建。