0

自分のリソースの URL を短縮することを目的とした Rails プロジェクトでは、routes.rb にルートを作成しました。

resources :users do
    resources :datas, controller: :data_defaults
end

そして、名前付きパスを取得します: rake routes

user_datas     GET    /users/:user_id/datas(.:format)          data_defaults#index
               POST   /users/:user_id/datas(.:format)          data_defaults#create
 new_user_data GET    /users/:user_id/datas/new(.:format)      data_defaults#new
edit_user_data GET    /users/:user_id/datas/:id/edit(.:format) data_defaults#edit
     user_data GET    /users/:user_id/datas/:id(.:format)      data_defaults#show
               PUT    /users/:user_id/datas/:id(.:format)      data_defaults#update
               DELETE /users/:user_id/datas/:id(.:format)      data_defaults#destroy

次に、部分的な _form.html.haml を使用して新しいレコードを作成し、data_default レコードを編集します。
DataDefault コントローラーでは、新しいアクションと編集アクション用に次のようにします。

def new
  @data_default = current_user.data_defaults.new
  ...
end
def edit
  @data_default = DataDefault.find(params[:id])
end

次に、_form パーシャルで、アクション フォーム用に次のようにします。

=form_for [current_user,@data_default] do 
.....

この時点で、新しい DataDefault レコードの取得または編集を開始すると、エラーが発生します。

undefined method `user_data_defaults_path'

しかし、コントローラーのルートを変更したことはわかっているので、url: をに追加しform_for
ます。

- uurl = action_name == "new" ? user_datas_path(current_user, @data_default) : user_data_path(current_user, @data_default)
= form_for [current_user,@data_default] do |f|

注: 異なるアクションの user_datas_path と user_data_path。

問題は次のとおりです。この種のルートでは、それが機能するフォームを持つ正しい方法ですか?
ありがとうございます。
ジョルジオ

4

1 に答える 1

1

Rails は form_for のオブジェクトに基づいてルート名を推測するため、モデルの名前に基づいてリソースを定義する必要があります。または、url を手動で指定することもできます。

ルート:

resources :users do
    resources :data_defaults
end

URL を のよう/users/:user_id/datas(.:format)にしたい場合は、次のことができます。

resources :users do
    resources :data_defaults, path: 'datas'
end

見る:

=form_for [current_user,@data_default] do |f|
  = f.text_field :name .............

=link_to 'back', users_data_defaults_path(current_user)
于 2013-08-14T14:13:06.193 に答える