5
  • 我有一个模型“问题”和一个嵌套模型“关系”
  • 在 issue.rb 中我提到过:

    has_many :relationships, :dependent => :destroy
    accepts_nested_attributes_for :relationships, :allow_destroy => true
    
  • 在 relationship.rb 我提到过:

    belongs_to :issue
    
  • 在 Ryan Bates Railcast#196 之后,我的问题控制器中有以下内容:

    relationship = @issue.relationships.build
    

但是,我遇到错误“未知属性:关系”

我在这里做错了什么吗?我确实在日志中看到将关系属性传递给服务器,但是,此错误不会让创建成功。

我在 Rails 方面的专业知识是初学者水平,所以如果我问一个可能被认为微不足道的问题,请原谅我。

谢谢您的帮助。

编辑:相关控制器代码:

    @relationship = @issue.relationships.build
    #@relationship = Relationship.new(params[:relationship])
    if @relationship.issue_id = ''
      @relationship.issue_id = @issueid
    end

    if @relationship.cause_id = ''
      @relationship.cause_id = @issueid
    end

    @relationship.save
    redirect_to(:back, :notice => 'New Relationship was created') 

我在跟踪中看到的:

    ActiveRecord::UnknownAttributeError in IssuesController#create
    unknown attribute: relationship

在问题参数中,我看到关系参数按预期传递:

    "relationship"=>{"issue_id"=>"100",
    "cause_id"=>""}

另一个更新 发布 form_for 代码:

    - form_for Issue.new do |f|

      .field  
        = f.text_field :description, :class=>"formfield", :id=>"frm_descr"

      .field  
        = f.hidden_field :wiki_url, :class=>"formfield", :id=>"frm_wiki_url"

      .field
        = f.hidden_field :short_url, :class=>"formfield", :id=>"frm_img_url"

      .field
        = f.hidden_field :title, :class=>"formfield", :id=>"frm_title"         

      = f.fields_for :relationship do |builder|
        = builder.text_field :issue_id, :class=>"form_field", :id=>"frm_rel_issue_id", :value=>@issue.id 
        = builder.text_field :cause_id, :class=>"form_field", :id=>"frm_rel_cause_id"

      .actions
        = f.submit 'Create', :class=>"save_button", :name=>"save_issue_rel_button", :id=>"val_collector"
4

4 回答 4

9

更改此行

= f.fields_for :relationship do |builder|

对此:

= f.fields_for :relationships do |builder|

您的问题 has_many 关系 - 复数。这将为您提供正确的关系属性参数。

于 2011-07-27T11:35:32.860 回答
4

这是工作的骨架代码:我创建了一个新项目并尝试了其他答案的组合,最后使它工作。

这是我的解决方案,之后是需要注意的事情。我正在使用不同的模型,所以请耐心等待:

  • 我的模型是:讨论has_many posts
  • 讨论没有属性。
  • 帖子有 content:text 和 discussion_id:integer。

工作代码

(模型)讨论.rb

has_many :posts
accepts_nested_attributes_for :posts

(模型)post.rb

belongs_to :discussion

路线.rb

resources :discussions do
  resources :posts
end

(讨论视图)_form.html.erb

<%= form_for(@discussion) do |f| %>
  <%= f.fields_for :posts, @post do |p| %>
    <%= p.text_area :content %>
  <% end %>
  <%= f.submit %>
<% end %>

(控制器) Discussions_controller.rb

  def new
    @discussion = Discussion.new
    @post = @discussion.posts.build

    respond_to do |format|
      format.html # new.html.erb
      format.xml  { render :xml => @discussion }
    end
  end

  def create
    @discussion = Discussion.new(params[:discussion])

    respond_to do |format|
      if @discussion.save
        format.html { redirect_to(@discussion, :notice => 'Discussion was successfully created.') }
        format.xml  { render :xml => @discussion, :status => :created, :location => @discussion }
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => @discussion.errors, :status => :unprocessable_entity }
      end
    end
  end

可能出错的事情

首先,Thilo 是对的,我得到未知属性:post if I do

# WRONG!
f.fields_for :post

Second, I have to have the @post instance variable in new action otherwise the post.context textarea will not show up.

# REQUIRED!
@post = @discussion.posts.build

Third, If I use the f.fields_for @post, the create action will complain unknown attribute: post too.

# WRONG!
f.fields_for @post do |p|

Use this instead:

# RIGHT!
f.fields_for :posts, @post  do |p|

The End

So yeah, I wish we get to see more documentations on this (can't see any useful ones). For example I see some use of form_for [@discussion, @post] but I can never get it to work.

于 2011-07-28T06:54:55.087 回答
0

我假设您正在控制器中构建关系,然后尝试在视图中使用它。为了使其可见,您必须将其设为实例变量。您需要做的就是在 from 的名称中添加一个 @ 符号relationship,就像您对 . 所做的那样@issue

@relationship = @issue.relationships.build

编辑:由于 OP 在提出原始问题后提供了更多信息,这个答案现在显然不适用。

于 2011-07-27T00:55:41.567 回答
0

通过使用accepts_nested_attributes,您创建了一个setter 方法relationship_attributes=。

我注意到有几件事需要改变。

你不需要设置

@relationship = @issue.relationships.build

您的表格应如下所示(您有 f.fields_for :relationship)

= form_for @issue do |f|

  # your issue fields here

  = f.fields_for :relationships do |r|

    # your relationship fields here

这里的美妙之处在于您不必设置任何 id 或任何东西。

于 2011-07-27T03:50:28.677 回答