从application.html.erb访问模型属性

时间:2014-09-11 05:49:45

标签: ruby-on-rails ruby

我有模型:消息,我希望所有用户都可以保存描述,我想要所有应用程序中的内容,我得到错误: Rails未定义方法`model_name& #39; 即可。 他似乎无法识别出来的模型: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>

2 个答案:

答案 0 :(得分: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 #create

在你的MessagesController中

skip_before_action :message

def create
 # do stuff
end

答案 1 :(得分:1)

<强>部分

错误将出现在form_for

中的partial来电

-

目前,你正在调用这样的部分:

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

这可能不会传递您需要的变量,从而阻止simple_form_for从对象中提取model名称(它需要)。

为了给您一个解释,simple_form_for方法建立在Rails中的form_for方法之上,而Rails又使用您发送的@objects来构建<form>完整的:

  

form_for生成适当的表单标记并生成表单生成器   知道表单所在模型的对象。输入字段是   通过调用表单生成器上定义的方法创建,这意味着   他们能够生成适当的名称和默认值   对应于模型属性,以及方便的ID等。   生成的字段名称中的约定允许控制器接收   表格数据很好地构造在params中,不费吹灰之力。

简而言之,这意味着如果您要使用simple_form_for(并且凭借form_for),您需要将有效的Ruby / Rails对象传递给表单。我相信你错过了部分会阻止这种情况发生。


<强>修正

您需要执行以下操作:

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

应该将正确的数据传递给表单,当然假设数据一开始就存在。为确保这种情况(因为我看到您将其用作布局的一部分),每次调用操作时都需要调用@message变量:< / p>

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

   private

   def set_message
      @message = Message.new
   end
end

这将每次都设置@message变量 - 让您能够调用它&amp;每次加载页面时都将其应用到form_for