在非常规视图中嵌入部分形式

时间:2013-07-23 13:15:42

标签: ruby-on-rails ruby

我已经在我的用户展示视图中为常规脚手架形式部署了一个任务模型。我的想法是,用户可以在同一页面上发布和查看帖子。我在用户show动作中定义了一个任务,如此

def show
@user = User.find(params[:id])
@task = current_user.tasks.new

respond_to do |format|
  format.html # show.html.erb
  format.json { render json: @user }
end
end

它确实创建了帖子,但它没有显示它们。关于为什么会这样的任何想法?

显示页面

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

  <ul>
    <% @task.errors.full_messages.each do |msg| %>
    <li><%= msg %></li>
    <% end %>
  </ul>
 </div>
<% end %>

<div class="field">
  <%= f.label :description %><br />
  <%= f.text_field :description %>
</div>

<div class="actions">
  <%= f.submit %>
</div>
<% end %>
#_form

#index page
<% current_user.tasks.each do |task| %>
 <%= task.description %>
<% end %>

1 个答案:

答案 0 :(得分:0)

这很奇怪,因为您找到了@user,但是使用current_user为您的表单创建了一个新的task实例:

@user = User.find(params[:id])
@task = current_user.tasks.new

我认为current_user已根据Cookie,会话或令牌找到了用户模型,因此您在@user操作中可能不需要show

除此之外,如果您担心视图不显示current_user的任务列表,那么您需要确保视图具有正确的标记,因此您应该向我们展示您目前的观点也是如此。这就是我假设你要做的事情:

class UsersController < ApplicationController
  def show
    @task = current_user.tasks.new

    respond_to do |format|
      format.html
      format.json { render json: current_user }
    end
  end
end

class TasksController < ApplicationController
  def create
    @task = current_user.tasks.new params[:task]
    if @task.save
      # Send a new request to users#show
      redirect_to current_user
    else
      # No request will be sent to users#show and the template will just get
      # rendered with @task containing the same values from the initial request
      # with form input
      render 'users/show'
    end
  end
end

# app/views/users/show.html.erb

<ul><%= render current_user.tasks %></ul>

<%= form_for @task do |f| %>
  <%= f.text_field :name %>
  <%= f.submit %>
<% end %>

# app/views/tasks/_task.html.erb

<li><%= task.name %></li>