コントローラーBからコントローラーAの作成アクションを呼び出す必要があります。
その理由は、コントローラーBから呼び出しているときに別の方法でリダイレクトする必要があるためです。
Railsでできますか?
コントローラーBからコントローラーAの作成アクションを呼び出す必要があります。
その理由は、コントローラーBから呼び出しているときに別の方法でリダイレクトする必要があるためです。
Railsでできますか?
回答:
そのアクションへのリダイレクトを使用できます:
redirect_to your_controller_action_url
詳細:Railsガイド
新しいアクションをレンダリングするには:
redirect_to your_controller_action_url and return
render
代わりにすべきだと思いredirect_to
ます。@Spyros、なんて言うの?
redirect_to
使用post: :method
を許可していません。これはcreate
、@ ddayanが最初に要求したように、別のコントローラの既存のアクションにリダイレクトするのに特に役立ちます。同様の状況で、別のオブジェクトを作成する必要がある場合があります。他のcreate
アクションを呼び出すとDRYer ..
あるコントローラーを別のコントローラーから使用するには、次のようにします。
def action_that_calls_one_from_another_controller
controller_you_want = ControllerYouWant.new
controller_you_want.request = request
controller_you_want.response = response
controller_you_want.action_you_want
end
controller_you_want
たい場合は、次のようにしますcontroller_you_want.process(:action_you_want)
render status: :ok, json: JSON.parse(controller.render(:action_you_want).first)
、他のコントローラーからJSONを返すように機能しているようです
controller_you_want.request
ますが、ハッシュまたはパラメーターのインスタンスを渡してこの発砲を取得できませんでした。
params
利用可能になるcontroller_you_want
設定することで、request
3行目に。それはあなたが求めていることですか?
render html: controller_you_want.process(:action_you_want)
あなたが提示するロジックはMVCではなく、Railsと互換性がありません。
コントローラーがビューまたはリダイレクトをレンダリングする
メソッドがコードを実行する
これらの考慮事項から、コントローラーでメソッドを作成し、アクションからそれらを呼び出すことをお勧めします。
例:
def index
get_variable
end
private
def get_variable
@var = Var.all
end
つまり、別のコントローラを介してまったく同じことを実行し、コントローラBにいる間にコントローラAからメソッドを呼び出すことができます。
語彙は非常に重要なので、私は強く主張します。
get_variable
別のコントローラーからどのように呼び出すことができますか?
を使用url_for
してコントローラとアクションのURLを取得し、を使用redirect_to
してそのURLに移動できます。
redirect_to url_for(:controller => :controller_name, :action => :action_name)
redirect_to url_for(:controller => :controller_name, :action => :action_name, :param1 => :val1, :param2 => :val2)
結果はになり/contorller_name/action_name?param1=val1¶m2=val2
ます。ドキュメントを
これは、別のコントローラーアクションを呼び出すのは悪い習慣です。
あなたがすべき
私の意見:
3番目のアプローチは、私が頻繁に使用していたものです。だから少し例を示します。
def create
@my_obj = MyModel.new(params[:my_model])
if @my_obj.save
redirect_to params[:redirect_to] || some_default_path
end
end
したがって、このアクションredirect_to
パラメータに送信できます。これは、任意のパスにすることができます。
/models
またはの通常のクラスまたはモジュール/lib
)に移動することで、その重複を回避できます。唯一の問題は、コントローラーがインスタンス変数を介してビューと通信する場合です。その重複を別の方法で修正する必要があります。
おそらく、ロジックをヘルパーに抽出できますか?ヘルパーはすべてのクラスで使用でき、コントロールを転送しません。その中で、おそらくコントローラー名をチェックして、それがどのように呼び出されたかを確認できます。
作曲救助に!
理由を考えると、コントローラ全体でアクションを呼び出すのではなく、コードの共有部分とカスタム部分を分離するようにコントローラを設計する必要があります。これにより、コードの重複とMVCパターンの破壊の両方を回避できます。
これはさまざまな方法で実行できますが、懸念事項(構成)を使用することをお勧めします。
# controllers/a_controller.rb
class AController < ApplicationController
include Createable
private def redirect_url
'one/url'
end
end
# controllers/b_controller.rb
class BController < ApplicationController
include Createable
private def redirect_url
'another/url'
end
end
# controllers/concerns/createable.rb
module Createable
def create
do_usefull_things
redirect_to redirect_url
end
end
お役に立てば幸いです。
これらの関数をコントローラーから分離し、モデルファイルに入れます。次に、モデルファイルをコントローラーに含めます。