如何在另一个页面上呈现另一个模型?

时间:2016-03-15 00:06:56

标签: ruby-on-rails-4

好的,所以我看了看stackoverflow和许多其他网站上发布的很多答案,因为我知道这是一个常见问题,但我似乎无法得到它,如果有人能指出我正确的方向,我会非常感激。我试图在这里实现的非常简单,我试图将另一个模型的新表单发布渲染到我的主页,这是我创建的另一个控制器。所以基本上在我的主页上显示了用户创建的所有最近帖子的列表。此外,我希望用户能够直接从主页添加新帖子。现在我显示它然而点击提交按钮绝对没有。

以下是POST的表单

<div class="panel panel-primary">

  <div class="container">
    <div class="panel-heading">
    <%= image_tag @post.user.avatar.url(:post_pic), class:"img-thumbnail" %>
    <%= @post.user.name %>

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

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

      <div class="field">
        <%= f.label :content %><br>
        <%= f.text_area :content %>
      </div>

      <div class="field">
        <%= f.file_field :avatar %>
      </div>
    </div>
    </div>
    <div class="panel-footer">
      <div class="actions">
        <%= f.submit %>
      </div>
    </div>
  <% end %>
</div>

这是我的主页控制器

class HomeController < ApplicationController
  def index
    if user_signed_in?
        @posts = Post.all
        @post = current_user.posts.build

    else
        redirect_to new_user_registration_path
    end
  end

  def create
    @post = current_user.posts.build(post_params)
    @post.save
  end

 private
  # Use callbacks to share common setup or constraints between actions.
  def set_post
    @post = Post.find(params[:id])
  end

  # Never trust parameters from the scary internet, only allow the white list through.
  def post_params
    params.require(:post).permit(:user_id, :content, :avatar)
  end
end

最后是我的主页索引

<div class="row">
    <div class="col-md-3"></div>
    <div class="col-md-5">
        <h1>Home#index</h1>
        <p>Find me in app/views/home/index.html.erb</p>

        <%= render 'posts/form' %>

        <% @posts.each do |post|%>
            <div class="panel panel-default">
                <div class="panel-heading">
                    <h3 class="panel-title">
                        <%= image_tag post.user.avatar.url(:post_pic), class:"img-thumbnail" %>
                        <%= post.user.name %>
                    </h3>
                </div>
              <div class="panel-body">
                <%= post.content %></br></br>

                <% if post.avatar.file? %>
                <%= image_tag post.avatar.url(:test), class:"img-thumbnail" %></br>
                <% end %>
              </div>
            </div>
        <% end %>
    </div>
</div>

路线

Rails.application.routes.draw do
  resources :posts
  get 'users/index'

  get 'users/show'

  root 'home#index'

  devise_for :users

1 个答案:

答案 0 :(得分:0)

所以,您使用另一个控制器(主页)代替帖子控制器来保存帖子数据,对吧?

您的部分表单供帖子使用:

<%= form_for(@post) do |f| %>
// @post generated url (/posts)
// will look for create method in POST Controller

我建议您将保存代码放在适当的控制器(帖子)中,这样就可以防止代码重复/冗余

提示: 如果您担心从主页视图或帖子视图重定向,

您可以使用参数[:控制器] 检查请求的来源 ,只需使用 if语句

最后,您可以在保存后将其重定向到正确的页面