如何在Rails中创建新记录时自动设置字段的值

时间:2012-03-31 14:33:18

标签: ruby ruby-on-rails-3

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页面上的“创建新测试”链接来创建测试。

有什么建议吗?

2 个答案:

答案 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'