2014-09-11 64 views
0

我有模型:消息,我希望所有的用户都可以保存说明,我希望沿着所有的应用程序的东西,蝙蝠我得到错误:Rails未定义的方法`model_name'。 看来,他不能从识别模型:application.html.erb从application.html.erb访问模型属性

_header.html.erb

<ul id="drop-nav"> 
    <li><a href="#">Bag</a> 
    <ul> 
    <%= simple_form_for (message) do |f| %> 
    <div class="form-inputs"> 
     <%= f.text_field :description , as: :text %> 
     <%= f.submit "Save" %> 
    </div> 
    <%end%> 
    </ul> 
    </li> 
</ul> 

application.html.erb

<!DOCTYPE html> 
<html> 
<head> 
    <title>Calendar</title> 
    <%= stylesheet_link_tag"application" , :media => "all" %> 
    <%= javascript_include_tag "application" %> 
    <%= csrf_meta_tags %> 
</head> 
<body> 
<%= render 'layouts/header' , message: @​message%> 
<%= yield %> 

</body> 
</html> 
+1

你的控制器是什么样的? – awendt 2014-09-11 06:00:45

+0

什么是应用程序控制器中的@消息? – 2014-09-11 06:02:36

+0

您的模型是从ActiveRecord :: Base继承的吗? – 2014-09-11 06:17:50

回答

1

集在应用程序控制器中启动before_filter

before_filter :message 

private 
def message 
    @message = Message.new 
end 

现在这个动作会在每次请求被执行,将可应用广泛

在你_header.html.erb

<%= simple_form_for message, url: message_path, method: :post do |f| %> 

将提交给MessagesController#创建

在你MessagesController

skip_before_action :message 

def create 
# do stuff 
end 
1

部分

错误将与您form_for呼叫您partial

-

目前,我们正在调用的部分是这样的:

<%= render 'layouts/header' , message: @​message%> 

这有可能将不通过你需要的变量,从而阻止simple_form_for从对象(它需要)中取出model名称。

为了给大家一个交代,该simple_form_for方法建立在form_for方法在Rails的,这反过来使用@objects的顶部,你把它建立在整体上<form>

form_for产生适当的窗体标签并生成表单构建器 知道表单所关注的模型的对象。输入字段为 ,通过调用表单构建器上定义的方法创建,这意味着 他们能够生成与模型属性对应的适当名称和默认值 以及方便的ID等。 生成的字段名中的约定允许控制器在您的身边无需付出努力就可以收到 表格数据。

简洁地说,这意味着,如果你打算使用simple_form_for(并凭借,form_for),你需要一个有效的Ruby/Rails对象传递到窗体。我相信你对部分的错误调用会阻止这种情况发生。


修复

你需要做到以下几点:

<%= render 'layouts/header', locals: { message: @message } %> 

应该正确的数据传递到形式,假设当然,该数据存在开始。为了确保这种情况(因为我看到你使用它作为您的布局的一部分),你需要在每次调用@message变量调用一个动作:

#app/controllers/application_controller.rb 
class ApplicationController < ActionController::Base 
    before_action :set_message 

    private 

    def set_message 
     @message = Message.new 
    end 
end 

这将设置每次变量为@message - 让您可以调用它&将其应用于每次加载页面时的form_for