Rails在控制器动作中形成,在另一个视图中呈现?

时间:2013-05-11 19:06:01

标签: ruby-on-rails ruby-on-rails-3 views partial-views

我将详细设置方案,然后是我的问题。

以下是该方案:

我有一个联系人控制器,有新的和创建动作。这是我希望用户填写并存储他们的回复的表单。

联系管制员:

class ContactController < ApplicationController

  def new
    @contact = Contact.new
  end

  def create
    @contact = Contact.new(params[:contact])
    respond_to do |format|
      if @contact.save
        format.html { redirect_to social_path, notice: 'Message sent successfully!' }
      else
       format.html { render action: 'new' }
      end
    end
  end
end

我有一个相应的_form.html.erb部分,以及一个new.html.erb视图,它将表单部署为部分,就像你一样。这些视图都位于联系人视图文件夹内,并带有相应的路径。

_form.html.erb

<%= form_for @contact do |f| %>
  <% if @contact.errors.any? %>
    <h2>
      <%= pluralize(@contact.errors.count, "error") %> prohibited this contact from being saved:
    </h2>

    <ul>
    <% @contact.errors.full_messages.each do |msg| %>
      <li><%= msg %></li>
    <% end %>
    </ul>
  <% end %>
<div class="row collapse">
  <div class="large-2 columns">
    <%= f.label :name, :class => 'inline' %>
  </div>
  <div class="large-10 columns">
    <%= f.text_field :name, :placeholder => 'Kenny Powers' %>
  </div>
</div>
<div class="row collapse">
  <div class="large-2 columns">
    <%= f.label :subject %>
  </div>
  <div class="large-10 columns">
    <%= f.text_field :subject %>
  </div>
</div>
<div class="row collapse">
  <div class="large-2 columns">
    <%= f.label :email %>
  </div>
  <div class="large-10 columns">
    <%= f.text_field :email, :placeholder => 'kennypowers@example.com' %>
  </div>
</div>
<div class="row collapse">
  <div class="large-2 columns">
    <%= f.label :message %>
  </div>
  <div class="large-10 columns">
    <%= f.text_area :message %>
  </div>
</div>
<div class="row collapse">
  <div class="large-2 columns end">
    <%= f.submit %>
  </div>
</div>
<% end %>

new.html.erb     &lt;%= render'contact / form'%&gt;

我创建了一个static_pages控制器,因为我希望将大多数静态页面与加载动态内容的页面分开。

在static_pages控制器内部,我有一个空的社交控制器动作。我在social.html.erb上显示静态内容,该静态内容位于static_pages视图文件夹中,匹配路由如下

match 'social' => 'static_pages#social'

social.html.erb

<%= render :template => 'contact/new', :@contact => Contact.new %>

static_pages_controller

def social

end

很酷,社交网页呈现完美。

现在对于与我混淆的部分:

如何在社交页面中呈现联系表单?因为它位于social.html.erb文件中,我有

<%= render template: 'contact/new' %>

给了我

ActionView::MissingTemplate in Static_pages#social

Showing app/views/contact/new.html.erb where line #1 raised:

1: <%= render 'form' %>

它为contact / new.html.erb中的_form.html.erb丢失了一个模板错误。如果我尝试通过添加

来指定表单位置
<%= render 'contact/form' %>

我收到undefined method model_name for NilClass:Class错误。

我这样做完全错了吗?有没有更好的方法来做我正在尝试的事情?有人可以给我一个外行解释吗?

我知道将形式部分渲染到其他控制器中存在类似的问题,但它们只是一个行解决方案。我非常感谢支持为什么会发生这种情况的话,或者支持更好/更正确的做事方式的话。

如果您需要更多信息/特定代码,请告知我们。

1 个答案:

答案 0 :(得分:2)

解决方案是:

将“social.html.erb”复制并粘贴到“/contact/new.html.erb”

然后将该特定渲染更改为:

<%= render 'form' %>    # that's ok now, because you are in the right directory

现在位于routes.rb:

resources :contacts     # it's important to add this for RESTful architecture

match 'social' => 'contact#new' # and DELETE the other line with => 'contact#index' because it is no more necessary

就是这样。

更新:这是我的问题的github解决方案(在您的应用程序中)

https://github.com/rubybrah/solution