【问题标题】:regarding using render in ruby on rails关于在 ruby​​ on rails 中使用渲染
【发布时间】:2013-07-17 07:58:00
【问题描述】:

我是 Rails 新手,仍在研究基础知识,因此非常感谢任何提示和建议!

我在网站上创建了一个功能联系页面,我希望能够在不同页面上呈现选项卡内的表单和功能。我的视图文件夹中的 static_pages 文件夹中有以下代码:

<div id="tabs">
 <ul>
    <li><a href="#tabs-1">About</a></li>
    <li><a href="#tabs-5">Contact</a></li>
 </ul>
  <div id="tabs-1">
   <%= render "shared/about"%>
</div>
 <div id="tabs-5">
   <%= render "contact/new"%>
 </div>

其中 对应于视图中contact 中的new.html.erb 文件。

我的 routes.rb 里面的相关代码是

match 'contact' => 'contact#new', :as => 'contact', :via => :get
match 'contact' => 'contact#create', :as => 'contact', :via => :post

这是我的控制器:

 class ContactController < ApplicationController

  def new
    @message = Message.new
  end

  def create
    @message = Message.new(params[:message])

    if @message.valid?
      NotificationsMailer.contact_pr(@message).deliver
      redirect_to(root_path, :notice => "Message was successfully sent.")
    else
      flash.now.alert = "Please fill all fields."
     render :new
    end
  end
end

但是,似乎无论我尝试什么,我仍然无法呈现表单。如果这是一个非常简单的问题,我深表歉意,我最感兴趣的是在 Ruby on Rails 的基础上变得更好,所以任何建议都值得赞赏!谢谢!

【问题讨论】:

  • 您遇到了什么错误?
  • 也许你需要在你渲染标签的动作中在 static_pages 控制器中初始化@message = Message.new。

标签: html ruby-on-rails render partial


【解决方案1】:

如果您想在其他模板中呈现此表单(并且您确实这样做了),您应该将其提取为部分命名,例如:_form.html.erb

那么,你应该把

<%= render 'contact/form' %>

在您需要此局部视图的任何地方(包括new.html.erb 模板)。 当你做完这些,你应该离开

render :new

在控制器中,因为它的工作方式与视图中的有点不同,它呈现适当的动作模板而不是部分。 当然,您需要在需要此部分的任何地方设置@message 变量。或者,您可以输入您的部分:

<%= form_for(@message || Message.new) do |f| %>

更多关于布局和渲染的信息here

【讨论】:

  • 执行上述解决方案会给我 NilClass:Class 的未定义方法 `model_name'
  • @user1337902 正如我所写,您需要在要呈现此部分的每个操作中设置@message。或者,您可以写成您的部分:form_for(@message || Message.new) ...
  • 太棒了!除了您的建议之外,添加 使它起作用。谢谢!!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-25
  • 2018-06-25
  • 2013-06-24
  • 2010-11-10
  • 2017-05-07
  • 1970-01-01
相关资源
最近更新 更多