2016-02-26 4 views
1

Я бы хотел вызвать новое действие контроллера для создания нового объекта с использованием существующего для установки значений по умолчанию. До сих пор, что я сделал, чтобы попробовать это:Передача параметров новому действию контроллера в Rails

link_to 'New' new_item_path(t)

В таблице Вайс Сетка где t является экземпляром item.

Путь, который генерируется, - /item/new.10, где 10 - это :id элемента, который я хотел бы использовать по умолчанию. Я могу получить его через request.referrer, но мне интересно, есть ли лучший способ для этого?

ответ

3

Если вы устанавливаете значения по умолчанию для нового объекта, вам следует рассмотреть возможность установки этих значений по умолчанию на уровне базы данных в ходе миграции. Чтобы сохранить систему RESTful, вы должны сохранить «новый» URL-адрес действия независимо от объекта, который вы захватываете по умолчанию, например, just/item/new.

Если вы хотите установить значения по умолчанию из существующего объекта без применения на уровне базы данных, вам следует рассмотреть возможность создания переменной экземпляра в действии вашего контроллера и использование этого в вашем представлении для установки значений по умолчанию в ваших элементах формы. Другой вариант - отредактировать объект в обратном вызове before_create в вашей модели и установить там поля. Изменение маршрута для размещения этой идеи было бы плохой дизайн ИМО.

Передача идентификатора к контроллеру как пары:

link_to "New Item Path", new_item_path(:default_item_id => item.id) 

в контроллере

@default_item = Item.find(params[:default_item_id]) 
+0

Так что, я думаю, вопрос заключается в том, чтобы получить идентификатор объекта, который я бледный t для использования в качестве значения по умолчанию для нового действия? – dlu

+0

Является ли он одним и тем же объектом каждый раз или уникальным для конкретного ресурса? Вы всегда можете использовать link_to link_to 'New' new_item_path (: default => id), который будет передавать идентификатор объекта в хеше params, поэтому item/new? Default = id, который является RESTful, предпочтительнее, и вы можете захватить объект по умолчанию в действии вашего контроллера, вызывая @object = Object.find (params [: default]) –

+0

Это уникально. Новый объект будет производным от существующего объекта (он наследует некоторые значения от него), но он также будет иметь поля, которые получают новые значения. Существует не один канонический объект, из которого все они происходят. – dlu

1

request.referrer? Вы должны быть в состоянии получить в ид в вас контроллере через params

Не уверен, если это проблема, но должна быть запятой между «Новой» и путем спецификацией

link_to 'New', new_item_path(t) 

затем в контроллере вы можете настройки сильного PARAMS, если вы хотите быть тщательны

ItemsController < ApplicationController 
    def new 
    # new action 
    end 

    def create 
    item = Item.new(item_params) 

    if item.save 
     flash[:notice] = 'Successfully created your item.' 
     redirect_to item #if there's an item#show page 
    else 
     flash[:alert] = 'Error: item not created.' 
     render :new 
    end 
    end 

    private 

    def item_params 
    params.require(:item).permit(:attribute_1, :attribute_2, ...) 
    end 
end 

Надеется, что это помогает

Смежные вопросы