据我了解,您可以使用渲染在视图中显示视图。我一直试图使用它是有一个显示页面,在这个页面中,有一些按钮。一个按钮将显示/隐藏用于创建活动的表单。本质上,页面将显示活动,并允许用户通过单击相应的按钮并填写表单来创建更多活动。
我试图渲染" new"对应于" new"的页面行动,但我遇到了以下问题
活动中的NoMethodError#display
未定义的方法`to_key'对于 活动:: ActiveRecord_Relation:0x694e270
正在搜索此错误,我认为它涉及"显示"我的活动控制器中的操作以及它不会指望" form_for"。我不知道如何解决这个问题,或者我是否正确使用渲染。
我想知道的是,如果这是可能的或推荐的,因为我看到的示例似乎在html中有共享元素时使用渲染,因此使用渲染会减少代码。显示页面是唯一具有创建活动形式的页面,因此我只需添加html代码即可。
感谢任何建议或帮助,谢谢!
活动显示HTML:
<nav aria-label="...">
<% @activity.each do |activity| %>
<div class = "row text-center">
<div class = 'col-md-4'>
<h3>
<%= activity.a_name %>
</h3>
</div>
</div>
<% end %>
<div class="panel-group">
<div class="panel-body">
<h2 align = "center">Activities</h2>
</div>
<div class="panel-group">
<div class="panel text-center">
<div class="panel-heading">
<h4 class="panel-title">
<a data-toggle="collapse" href="#collapse1">Collapsible list group</a>
</h4>
</div>
<div id="collapse1" class="panel-collapse collapse">
<ul class="list-group">
<li class="list-group-item">
<h1>ONE</h1>
</li>
<li class="list-group-item">Two</li>
<li class="list-group-item">Three</li>
</ul>
<div class="panel-footer">Footer</div>
</div>
</div>
</div>
</div>
<ul class="pager">
<li class="previous"><a href="#"><span aria-hidden="true">←</span>Previous </a></li>
<li class="next"><a href="#"> Next<span aria-hidden="true">→</span></a></li>
<div class="btn-group" role="group" aria-label="...">
<a href="new" class="btn_act">Add Activity</a>
</div>
<% render 'activities/new'%>
</ul>
</nav>
活动_new HTML:
<body>
<% flash.each do |key, value| %>
<div class="alert alert-<%= key %>"><%= value %></div>
<% end %>
<%= form_for @activity do |a| %>
<div class = "form-group">
<div class = "row top-buffer text-center">
<div class='col-md-3'>
<%= a.label :a_name, 'Activity Name' %>:
<%= a.text_field :a_name %>
</div>
</div>
<div class ="row top-buffer text-center">
<div class="col-md-3">
<%= a.submit 'Create', class: 'btn btn-primary'%>
</div>
</div>
</div>
<% end %>
</body>
活动控制器:
class ActivitiesController < ApplicationController
def display
@activity = Activity.all
end
def index
@activity = Activity.all
end
def show
@activity = Activity.all
end
def new
@activity = Activity.new
end
def create
@activity = Activity.create(activity_params)
if @activity.save!
flash[:success] = 'Activity created successfully!'
redirect_to activities_display_path
else
flash[:error] = 'ERROR: Activity was not saved!'
#render_to_string #normally would have it render to the name of view ex: :new
end
end
def edit
@activity = Activity.find(params[:id])
end
def update
@activity = Activity.update(activity_params)
if @activity.save
flash[:success] = 'Activity successfully updated!'
redirect_to root
else
flash[:error] = 'ERROR: Activity failed to update'
render_to_string
end
end
private
def activity_params
params.require(:activity).permit(:a_name)
end
end
编辑 - 03/10/17 管理以修复上面的错误。结果我需要添加 &#34; @activity = Activity.new&#34;进入&#34;显示&#34;控制器中的动作。之后,我改变了&#34; @activity = Activity.all&#34; to&#34; @activities = Activity.all&#34;。 然后在显示视图中,我改变了
<% @activity.each do |activity| %>
到
<% @activities.each do |activity| %>
并且渲染成功。感谢您的所有建议和帮助!
答案 0 :(得分:0)
作为命名约定,我会在新的,创建,编辑和更新操作及其相关视图中将@activities
重命名为@activity
。至于错误,form_for
应该用于单个对象,而不是集合。它应该是这样的:
<% @activities.each do |activity| %>
<div class = "row text-center">
<div class = 'col-md-4'>
<h3>
<%= activity.a_name %>
</h3>
</div>
</div>
<% end %>