Rails一对多嵌套表单 - 使用控制器显示操作查看已发布表单时出错?

时间:2016-02-15 15:46:09

标签: ruby-on-rails forms ruby-on-rails-4 rubygems

我正在尝试创建一个发布表单来发布网址&一些文字。嵌套表单提交时没有错误,但我无法在show动作控制器中显示该表单的后续内容。

发布模型

 class Post < ActiveRecord::Base
  has_many :texts
  has_many :urls 
  accepts_nested_attributes_for :texts, :urls 
 end

文字模型

 class Text < ActiveRecord::Base
  belongs_to :post 
 end

网址模型

class Url < ActiveRecord::Base
 belongs_to :post
end

后控制器

  class PostsController < ApplicationController

  def index
      @posts = Post.all 
  end

  def show
   @post = Post.find(params[:id])
   @texts = @post.texts 
   @urls = @post.urls 
 end 

 def new
  @post = Post.new 
 end 

 def create
  @post = Post.new(post_params) 
   if @post.save 
    redirect_to @post
   else 
    render 'new'
 end 
 end

   private 
   def post_params 
    params.require(:post).permit(:texts_attributes => [:textattr], :urls_attributes => [:urlattr])
   end 

show.html.erb

  <%= @text.textattr %> 
  <%= @url.urlattr %> 

数据库架构

       create_table "posts", force: :cascade do |t|
       t.datetime "created_at", null: false
       t.datetime "updated_at", null: false
       end

      create_table "texts", force: :cascade do |t|
      t.text     "textattr"
      t.datetime "created_at", null: false
      t.datetime "updated_at", null: false
      t.integer  "post_id"
      end

      add_index "texts", ["post_id"], name: "index_texts_on_post_id"

      create_table "urls", force: :cascade do |t|
      t.string   "urlattr"
      t.datetime "created_at", null: false
      t.datetime "updated_at", null: false
      t.integer  "post_id"
     end

     add_index "urls", ["post_id"], name: "index_urls_on_post_id"

     end

我在表单上按提交后出现错误消息 !(http://imgur.com/dzdss5z

你的帮助会很棒 - 谢谢!

1 个答案:

答案 0 :(得分:0)

@text@url变量永远不会在控制器的show动作中设置,因此它们是零。因此,当您尝试在视图中调用这些属性时会出现错误。

您已设置@texts@urls个变量,因此您可以执行以下操作:

<% @texts.each do |text| %>
  <%= text.textattr %>
<% end %>

<% @urls.each do |url| %>
  <%= url.urlattr %>
<% end %>