Rails noob在这里。我有一个rails应用程序(在这个例子中)有三个表。用户,机器和测试。
用户有很多机器和测试。
机器属于用户。
测试属于机器。
当我创建一个新测试时,我希望字段test.machine_id自动设置为拥有该测试的机器的id。我已经能够使用下拉菜单创建一个字段,显示current_user拥有的所有计算机,但我不希望用户必须手动设置此字段。
只能通过访问Machine Show页面上的“创建新测试”链接来创建测试。
*例如,用户1有机器4和5.当查看机器5的显示页面时,我想创建测试10.我希望test(10).machine_id设置为5而无需用户手动输入*
在我的tests_controller.rb文件中,我有以下内容:
def new
@test = Test.new
@machines = current_user.machiness.all
respond_to do |format|
format.html # new.html.erb
format.xml { render :xml => @test }
end
end
def create
@test = Test.new(params[:test])
respond_to do |format|
if @test.save
format.html { redirect_to(@test, :notice => 'Test was successfully created.') }
format.xml { render :xml => @test, :status => :created, :location => @test }
else
format.html { render :action => "new" }
format.xml { render :xml => @test.errors, :status => :unprocessable_entity }
end
end
端
我想我需要这样的东西:
def create
@test = current_machine.tests.build(params[:test])
...
end
...但我不认为current_machine是一个实际的对象。
只能通过访问Machine Show页面上的“创建新测试”链接来创建测试。
有什么建议吗?
答案 0 :(得分:2)
考虑为Test
模型使用嵌套资源。在路线文件中,您可以设置如下资源:
resources :machines do
resources :tests
end
这会使新Test
的路线看起来像/machines/:machine_id/tests/new
。所以现在你到新测试页面的链接看起来像
<%= link_to "New Test", new_machine_tests_path(@machine) %>
new
中的TestsController
行为与
def new
@test = Test.new
@machine = Machine.find(params[:machine_id])
...
end
最后,嵌套Test
资源的表单类似于
<%= form_for [@machine, @test] do |f| %>
...
设置表单以发布到自动包含machine_id的路径/machines/123/tests
。
因此,在您create
的{{1}}行动中,您可以执行类似
TestsController
答案 1 :(得分:1)
@test = Test.new(params[:test])
@test.your_field = 'default value'
或更改数据库中的字段以设置默认值:
change_column :tests, :your_column, :string, :default => 'default value'