Как автоматически установить значение поля при создании новой записи в Rails - PullRequest
1 голос
/ 31 марта 2012

Рельсы нуб тут. У меня есть приложение рельсов с (в этом примере) тремя таблицами. Пользователи, машины и тесты.

У пользователей много машин и тестов.

Машины принадлежат Пользователям.

Испытания принадлежат машинам.

Когда я создаю новый тест, я хочу, чтобы в поле test.machine_id автоматически устанавливался идентификатор машины, которой принадлежит этот тест. Мне удалось создать поле с раскрывающимся меню, отображающее все машины, принадлежащие current_user, но я не хочу, чтобы пользователь устанавливал это поле вручную.

Тесты могут быть созданы только путем доступа к ссылке «Создать новый тест» на странице машинного шоу.

* Например, у Пользователя 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 - это реальный объект.

Тесты могут быть созданы только путем доступа к ссылке «Создать новый тест» на странице машинного шоу.

Есть предложения?

Ответы [ 2 ]

2 голосов
/ 31 марта 2012

Рассмотрите возможность использования вложенного ресурса для вашей модели 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 действие вашего TestsController вы можете сделать что-то вроде

def create
  @test = Test.new(params[:test])
  @test.machine_id = params[:machine_id]
  ...
end
1 голос
/ 31 марта 2012
@test = Test.new(params[:test])
@test.your_field = 'default value'

или измените поле в базе данных, чтобы установить значение по умолчанию:

change_column :tests, :your_column, :string, :default => 'default value'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...