0

我做了一个 ruby​​ on rails 项目,它比它需要的复杂得多(5 个模型,而我只需要 3 个模型)在进行此更改后,我的代码停止工作。

错误信息是:

ActiveRecord::RecordNotFound in UserFooController#create

然后是:

找不到没有 ID 的 Foo。

所以我正在处理多对多的关系

用户 --> user_foo <--- foo

各型号如下

class Foo < ActiveRecord::Base
has_many :user_foos

attr_accessible :id
#etc

用户

class User < ActiveRecord::Base

has_many :user_foos

attr_accessible :id
#etc

user_foo

class UserFoo < ActiveRecord::Base

belongs_to :foo
belongs_to :user

attr_accessible :id, :user_id, :foo_id
end

所以这个想法是,从主页上按下一个按钮,将您带到 user_foo 表单 html 以填写 foo 中特定条目的详细信息。应用程序到此为止工作,但是在完成 foo 条目详细信息并按下提交按钮后,出现一个错误,提示“找不到没有 ID 的 Foo”

按钮的代码如下

<%= button_to 'Enter Foo', user_foos_path(foo_id: foo) %>

控制器创建 user_foo 看起来像这样

def create

@user_foo
foo = Foo.find(params[:foo_id])
@user_foo = foo
@user_foo = current_user
#etc

我很确定问题出在这个控制器上,但是经过数小时的代码调整后,我不得不来这里寻求帮助。非常感谢任何帮助或建议。

这是按钮周围的代码,根据要求

    <% if notice %>
        <p id="notice"><%= notice %></p>
    <% end %>

 <h1>Your Foo Catalog</h1>

 <% @foos.each do |foo| %>
<div class ="entry">
    <%= image_tag(foo.image_url) %>
    <h3><%= foo.title %></h3>
    <p><%= sanitize(foo.description) %></p>
        <div>
            <h3> The foo Starts on <%= foo.start_date %></h3>
        </div>
        <div>
            <h3> The foo will end on <%= foo.end_date %></h3>
    <%= button_to 'Enter foo', user_foos_path(foo_id: foo) %>
        </div>  
</div>
4

2 回答 2

2

使用 has_many_through:

class Foo < ActiveRecord::Base
  has_many :user_foos
  has_many :users, through: :user_foos

class User < ActiveRecord::Base

  has_many :user_foos
  has_many :foos, through: :user_foos

class UserFoo < ActiveRecord::Base

  belongs_to :foo
  belongs_to :user

你的 FoosController 看起来怎么样?

class FoosController < ApplicationController
  ....

  def new
    @foo = Foo.new
  end

  def create
    @foo = Foo.new(params[:foo])
    @foo.user = current_user  # i assume you have something similar to current_user
    ....
  end

以您的形式:

<%= button_to 'Enter Foo', user_foos_path(@foo) %>

关于下面的评论:我刚刚意识到您正在使用 UserFooController,您根本不需要它。您想要的是两个模型之间的关联,不需要额外的控制器。如果你想创建一个新的几个使用这个按钮: <%= button_to 'Enter Foo', new_foo_path %> 或者如果你想编辑 foo 使用: <%= button_to 'Change Foo', edit_foo_path(@foo) %>

于 2013-07-23T09:11:39.750 回答
0

问题是在包含您的按钮的页面上<%= button_to 'Enter Foo', user_foos_path(foo_id: foo) %>foo是零。你需要检查它应该是什么。很可能您在该页面的控制器实例变量中定义,只是在视图中@foo忘记了@

于 2013-07-23T09:12:15.237 回答