Rails - 使用不同的操作渲染视图?

时间:2017-03-10 02:22:58

标签: html ruby-on-rails

据我了解,您可以使用渲染在视图中显示视图。我一直试图使用它是有一个显示页面,在这个页面中,有一些按钮。一个按钮将显示/隐藏用于创建活动的表单。本质上,页面将显示活动,并允许用户通过单击相应的按钮并填写表单来创建更多活动。

我试图渲染" 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">&larr;</span>Previous </a></li>
    <li class="next"><a href="#"> Next<span aria-hidden="true">&rarr;</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| %>

并且渲染成功。感谢您的所有建议和帮助!

1 个答案:

答案 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 %>