2014-08-31 3 views
0

Я хотел бы передать дополнительное поле, скажем, ITEM_ID в эти строки кодов (оба контроллера и модели):Как передать дополнительные параметры в Rails от контроллера к модели

# transactions_controller.rb (controller) 
@transaction = Transaction.new(app_token: params[:token]) 

# transaction.rb (model) 
def app_token=(token) 
    write_attribute(:app_token, token) 

    # I want to add a few more lines of code here so that I can manipulate item_id 
end 

Это означает, что я бы как мой item_id, который должен быть передан от контроллера к модели, чтобы я мог манипулировать им, некоторые настройки в модели.

Что было бы лучшим способом для этого (на основе кода выше)?

=== Дополнение 1-Sep-2014 для получения более подробной информации ===

У меня есть объединение тележки и сделок, в которой ТЕЛЕГУ HAS_MANY сделки и сделки belongs_to корзины; ниже - контроллер;

# transactions_controller.rb (controller) 
def new 
    @transaction = Transaction.new(app_token: params[:token]) 
end 

В то время как метод ниже в модели:

# transaction.rb (model) 
def app_token=(token) 
    write_attribute(:app_token, token) 

    # I want to add a few more lines of code here so that I can manipulate cart.id 
end 

То, что я хотел бы достичь здесь должна пройти в cart.id в метод app_token, который расположен в transaction.rb , Обратите внимание, что этот cart.id не предназначен для сохранения в базе данных, который я могу легко сделать с помощью метода create через build, но, скорее, этот cart.id используется для передачи в метод вызова других методов, которые расположены в методе app_token, который находится в модели transaction.rb. Причина, по которой я делаю это, заключается в том, что служба, с которой я общаюсь, возвращает токен, и я хотел бы провести токен и выполнить другой метод, который требует, чтобы cart.id находился.

Таким образом, я просто хотел бы понять, на основе данного формата контроллера и модели выше, что наиболее рекомендуемый способ передать в этом cart.id в метод app_token, который находится в модели transaction.rb, которую я хотел бы использовать для других функции внутри метода?

Спасибо!

+0

Это неясно, о чем вы спрашиваете. Вы хотите передать произвольные элементы данных при инициализации экземпляра модели? Можете ли вы уточнить? – infused

+0

@ infused, я отредактировал этот вопрос, чтобы обеспечить дополнительную ясность. Дайте мне знать, если все в порядке? Извините за путаницу, вызванную, если она есть. –

ответ

1

У меня есть объединение тележки и сделок, в которой корзина has_many сделки и транзакции bELONGS_TO корзину

Поскольку это так и у вас уже есть объект корзины, в контроллере только инстанцирует сделку с тележкой:

transaction = cart.transactions.build app_token: params[:token] 
transaction.save 

cart_id будет доступен для всех методов экземпляра в модели, поэтому нет необходимости расширять app_token= с дополнительной логикой, не связанной с app_token. Вместо этого воспользуйтесь обратными вызовами ActiveRecord. Например, вы могли бы использовать before_save обратного вызова для реализации вашей логики:

class Transaction < ActiveRecord::Base 
    belongs_to :cart 
    before_save :do_something_with_cart 

    def do_something_with_cart 
    # I want to add a few more lines of code here so that I can manipulate cart_id 
    end 
end 

Если по какой-то причине обратного вызова не подходит к вашей пользы casae, вызовите пользовательский метод непосредственно в контроллере:

transaction = cart.transactions.build app_token: params[:token] 
transaction.do_something_with_cart 
+0

Благодарим вас за предложение! Я закончил использование метода сборки, как было предложено, и без использования метода save в ActiveRecord; как только объект транзакции будет построен, я вызываю метод в Модели для выполнения необходимых функций, которые я бы хотел! –

1

Вам не нужно переопределить app_token =

# transactions_controller.rb (controller) 
@transaction = Transaction.new(app_token: params[:token], item_id: params[:item_id]) 
@transaction.save 
+0

спасибо за выделение! Я просто хочу передать данные с контроллера методу модели в соответствии с моими вопросами выше, и это не имеет ничего общего с сохранением базы данных; Еще раз спасибо за помощь! –

1

Атрибут

Это будет в основном зависеть от того, есть ли у вас item_id настроить в качестве атрибута, либо виртуальный или в базе данных ,

Если у вас есть ассоциативное foreign_key создать уже, вы будете в состоянии обесценить то, что я собираюсь написать, но в случае, если у вас нет, вы должны учитывать следующее:

#app/models/transaction.rb 
class Transaction < ActiveRecord::Base 
    belongs_to :item # -> expects item_id by default 
end 

Если у вас нет ассоциации не создана (и, следовательно, нет атрибутов), вы хотите использовать attr_accessor для создания виртуального атрибута:

#app/models/transaction.rb 
class Transaction < ActiveRecord::Base 
    attr_accessor :item_id 
end 

Params

Передача атрибутов в Rails 4 на самом деле является наименьшей из ваших проблем - вы можете передать столько атрибутов по вашим маршрутам, сколько пожелаете.Проблемы возникают, когда вы пытаетесь сопоставить элементы с вашими объектами db (следовательно, моя рекомендация выше)

Если вы хотите передать атрибут item_id, вам просто нужно убедиться, что оно установлено в вашем представлении. Это делается либо с вашей routes, либо передав его в форме:

#config/routes.rb 
resources :items 
    resources :transactions #-> domain.com/items/:item_id/transactions/new 
end 

Это позволит вам пройти item_id вы хотите (который будет загружать в контроллерах, как params[:item_id] Вы также можете использовать следующие.:

#app/views/transactions/new.html.erb 
<%= form_for @transaction do |f| %> 
    <%= f.text_field :item_id %> 
    <%= f.text_field :token %> 
    <%= f.submit %> 
<% end %> 

Это даст вам возможность отправить два различных атрибутов контроллера, который затем может заселить следующим образом:

#app/controllers/transactions_controller.rb 
class TransactionsController < ApplicationController 
    def new 
     @transaction = Transaction.new 
    end 

    def create 
     @transaction = Transaction.new transaction_params 
     @transaction.save 
    end 

    private 

    def transaction_params 
     params.require(:transaction).permit(:item_id, :token) 
    end 
end 

Следует отметить метод form только будет жизнеспособным, если вы атрибут определены в вашей модели - либо в базе данных, или виртуальный (с attr_accessor)

+1

Спасибо Rich; То, что я пытаюсь достичь, - это больше о передаче данных от контроллера методу модели на основе данного кода (как показано, например, на примере выше); item_id, который я использовал, является просто примером и не имеет никакого отношения к какой-либо ассоциации; еще раз спасибо! : D –

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