活动记录关联未定义的方法' val' (build,create由has_many启用,belongs_to)

时间:2015-01-09 13:38:07

标签: ruby-on-rails associations

我对rails非常陌生,我在理解关联方面遇到了一些麻烦。我想做一个快速的论坛(只是线程 - 发布机制没有别的)。我的模型由:

生成
1. rails generate scaffold Forumthread title:string
2. rails generate scaffold Forumpost title:string content:text username:string

在我的模型中,我添加了关联:

class Forumthread < ActiveRecord::Base
    has_many :forumposts, dependent: :destroy
end

class Forumpost < ActiveRecord::Base
    belongs_to :forumthread
end

在一个线程的显示页面上,我希望能够为该线程创建一个forumpost。我想这样做: 视图:       &lt;%= notice%&gt;

<p>
  <strong>Title:</strong>
  <%= @forumthread.title %>
</p>

<% form_for(@post) do |f| %>

<div class="field">
    <%= f.label :title %><br>
    <%= f.text_field :title %>
  </div>
  <div class="field">
    <%= f.label :content %><br>
    <%= f.text_area :content %>
  </div>
  <div class="field">
    <%= f.label :username %><br>
    <%= f.text_field :username %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>


<%= link_to 'Edit', edit_forumthread_path(@forumthread) %> |
<%= link_to 'Back', forumthreads_path %>

和控制器:

def show
    @current_thread = Forumthread.find_by_id(params[:id])
    @post = @current_thread.forumposts.build
  end

我没有进入创建部分,因为它似乎只是键入@current_thread.forumposts.build来创建对象。我错过了什么? 我希望@post成为forumpost类型的对象,所以我可以用@current_thread.forumposts.create(forumposts_params);

创建

目前我收到以下错误:

undefined method `val' for #<Arel::Nodes::BindParam:0x007fe5c0648770>

如果需要,我会很乐意提供更多数据!

2 个答案:

答案 0 :(得分:19)

我记得在foreign_key缺失forumthread_id时看到这个错误,并且看起来这可能是你的情况,因为在为Forumpost创建脚手架时你没有包含它。 Forumposts的数据库表中有 create_table "forumsposts", force: true do |t| #some other fields t.integer "forumthread_id", null: false #some other fields end 列吗?如果您不知道我在说什么 - 请转到db / schema.rb文件并检查是否可以看到类似的内容:

foreign_key

如果没有,则必须生成并再运行一次迁移,将此缺少的rails generate migration AddForumthreadIdToForumpost添加到Forumspost。在https://github.com/rails/rails/commit/78bd18a90992e3da767cfe492f1bc5d63077da8a :)上阅读,运行rake db:migrate,在新创建的迁移文件中输入以下代码,然后运行class AddForumthreadIdToForumpost < ActiveRecord::Migration def change add_column :forumposts, :forumthread_id, :integer, null: false add_index :forumposts, :forumthread_id end end

{{1}}

答案 1 :(得分:0)

不确定您是否仍在处理此问题。但是,您是否在模型中尝试过accepts_nested_attributes_for

class Forumthread < ActiveRecord::Base
    has_many :forumposts, dependent: :destroy

    accepts_nested_attributes_for :forum_post
end

class Forumpost < ActiveRecord::Base
    belongs_to :forumthread

    accepts_nested_attributes_for :forum_thread
end