0

最初に、参照する演習を作成しました。次に、それらに対して「log_entries」を記録する機能を追加しました。

これはそのために機能します

  = semantic_form_for @exercise do |exercise|
    = exercise.semantic_fields_for :log_entries do |log_entry|
      = render 'log_entries/log_entry_fields', :f => log_entry
    .links
      = link_to_add_association 'Add Set', exercise, :log_entries, :partial => "log_entries/log_entry_fields", :data => {:role => "button", :icon => "plus"}
    = exercise.buttons do
      = exercise.commit_button "Apply", :button_html => {:data => {:icon => "check", :theme => "b"}}
      = link_to "Cancel", "", :data => {:rel => "back", :icon => "delete", :role => "button", :theme => "a"}

ユーザーに関連付ける必要があるという要件を追加しました。それを最善の方法で行う方法がわかりません。これは現在、エクササイズ コントローラーに投稿されており、エクササイズは実際にはユーザーに関連付けられていません。そのため、エクササイズ コントローラーでパラメーターをマージできましたが、それはハックのようです。

適切な方法は、ユーザーを介してログ エントリの関連付けを作成することですよね? しかし、フォームを再構築してそれを機能させるにはどうすればよいでしょうか?

log_entries を作成しているので、エクササイズ コントローラーをもう使用するべきではありません。LogEntryController では、そこからユーザーを設定できます...しかし、これを行う最善の方法は何ですか? 何らかの理由で、ワークアウトを log_entries コントローラーに渡し、コレクションを次のような形式でレンダリングする方法がわかりません。

たぶん、私は一日中コーディングで脳がうんざりしています。ありがとう!

関連付けの追加機能にCocoonライブラリを使用しています。

4

1 に答える 1

0

これを達成するために宝石は必要ありません。次の関連付けを検討してください。

class User < ActiveRecord::Base
  has_many :log_entries
end

class Exercise < ActiveRecord::Base
  has_many :log_entries
end

class LogEntry < ActiveRecord::Base
  belongs_to :user
  belongs_to :exercise
end

そして、次の深くネストされたルート:

YourApp::Application.routes.draw do
  resources :users do
    resources :exercises do
      resources :log_entries
    end
  end
end

これにより、次のような新しいリンクが作成されます (長いことはわかっています)。

<%= link_to new_user_exercise_log_entry_path(user, exercise) %>

ここでuser、 とは、が属するexerciseユーザー オブジェクトとエクササイズ オブジェクトです。log_entryURI のリソース部分は、たとえば次のようになります。

/users/1/exercises/1/log_entries/new

提出する必要があるのは log_entry フォームであり、エクササイズ フォームではないことに注意してください。

また、log_entry フォームで特別なことをする必要はありません。モデル間に関係が存在し、ルートがネストされているため、コントローラ アクションで and にparams[:user_id]アクセスして、そこにある新しいオブジェクトに割り当てることができます。params[:exercise_id]log_entrylog_entry

于 2012-08-11T09:15:27.793 に答える