0

私は RoR に比較的慣れていないので、レッスン サイトの共有バックエンドに取り組んでいます。

現在、レッスンとリビジョンの 2 つのモデルがあります。アイデアは、教師がレッスン/新しいページで(タイトル、説明などを使用して)レッスンを作成することです。フォームは、lesson/lesson_id/revision/new ページに他のフィールド (コンテンツ、コメント) がある別のフォームにリダイレクトされます。最終的に、教師は自分のプロフィールにリビジョンをコピーしてレッスンを「保存および変更」できるようになりますが、モデルはまだありません。

新しいレッスンとリビジョンの両方を作成する際に、私はまだ 2 つのおそらく基本的な問題に焦点を当てています。

1) レッスンをユーザーに保存し、改訂をユーザーとレッスンに保存します。ある時点で、リビジョンをユーザーに保存しましたが、レッスンは保存されませんでした。

2) レッスンフォームから改訂フォームへ、改訂フォームから改訂ページへのリダイレクト。コントローラーのリダイレクトと form_for ブロックの 1 つを変更しようとしましたが、役に立ちませんでした。新しいレッスン フォームは、new_lesson_revision_path でリダイレクトしようとした /lesson/1/revision/new ではなく、/lessons に移動する必要があります。改訂フォームも /revisions に戻ります。これは管理者のインデックスになりますが、/lesson/1/revision/1 などに移動したいと思います。

これらの問題のいずれかまたは両方に関するアドバイスをよろしくお願いします。

以下は参照用の私のコードです。routes.rb からの抜粋:

resources :lessons
resources :revisions #For index pages for admin
resources :lessons do
  resources :revisions
end

モデル

class Lesson < ActiveRecord::Base
  attr_accessible :stable, :summary, :title, :time_created
  has_many :revisions, :class_name => "Revision"
  has_many :users, :through => :revisions
end

class Revision < ActiveRecord::Base
  attr_accessible :comment, :lesson_id, :user_id, :description, :content, :time_updated
  belongs_to :lesson, :class_name => "Lesson", :foreign_key => "lesson_id"
  belongs_to :user, :class_name => "User", :foreign_key => "user_id"

  accepts_nested_attributes_for :lesson
end

レッスン new.html.erb

<% if user_signed_in? %>
  <h2>New lesson</h2>
  <%= form_for @lesson do |f| %>
  <%= render "form" %>
  <% end %>
  <%= link_to 'Back', lessons_path %>
<% else %>
<h3> Please <%= link_to 'sign in', new_user_session_path %> or <%= link_to 'create an account', new_user_registration_path %> to make and save lessons.</h3>
<% end %>

レッスン _form.html.erb

<%= form_for @lesson, :url => new_lesson_revision_path(@lesson_id, @revision) do |f| %>

  <div class="field">
    <%= f.label :title %><br />
    <%= f.text_field :title %>
  </div>
  <div class="field">
    <%= f.label :summary %><br />
    <%= f.text_area :summary %>
  </div>
  <div class="field">
    <%= f.label :stable %><br />
    <%= f.check_box :stable %>
  </div>

  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

リビジョン new.html.erb

<% if user_signed_in? %>
  <h2>New revision</h2>
  <%= form_for @revision do |f| %>
    <%= render "form" %>
  <% end %>
  <%= link_to 'Back', lessons_path %>
<% else %>
  <h3> Please <%= link_to 'sign in', new_user_session_path %> or <%= link_to 'create an account', new_user_registration_path %> to make and save revisions.</h3>
<% end %>

リビジョン _form.html.erb

<%= form_for(@revision) do |f| %>

  <div class="field">
    <%= f.label :description %><br />
    <%= f.text_field :description %>
  </div>
  <div class="field">
    <%= f.label :content %><br />
    <%= f.text_area :content %>
  </div>
  <div class="field">
    <%= f.label :comment %><br />
    <%= f.text_area :comment %>
  </div>

  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

レッスン コントローラー: 新規/作成

  def new
    @lesson = Lesson.new
  end

  def create
    @user = current_user
    @lesson = Lesson.new(params[:lesson])
    #@user.lessons << @lesson
    params[:lesson][:user_id] = current_user.id
    params[:lesson][:lesson_id] = @lesson.id
    respond_to do |format|
      if @lesson.save
        format.html { redirect_to new_lesson_revision_path(params[:lesson_id]), notice: 'Your lesson was successfully created.' }
        format.json { render json: @lesson, status: :created, location: new_lesson_revision_path}
      else
        format.html { render action: "new" }
        format.json { render json: @lesson.errors, status: :unprocessable_entity }
      end
    end
  end

リビジョンコントローラ: 新規/作成

  def new
    @revision = Revision.new
  end
  def create
    @lesson = Lesson.find(params[:lesson_id])
    @revision = @lesson.revisions.new(params[:revision])
    @revision.user_id = current_user.id
    @revision.lesson_id = @lesson.id
    @revision.time_updated = DateTime.now
    respond_to do |format|
      if @revision.save
       format.html { redirect_to current_user.profile }
       format.json { }
      else
      render :new
      end
    end
  end

最後に、私のレーキ ルートの結果のほとんどを以下に示します。

          home_index GET    /home/index(.:format)                            home#index
             profile POST   /profile(.:format)                               profiles#create
         new_profile GET    /profile/new(.:format)                           profiles#new
        edit_profile GET    /profile/edit(.:format)                          profiles#edit
                     GET    /profile(.:format)                               profiles#show
                     PUT    /profile(.:format)                               profiles#update
                     DELETE /profile(.:format)                               profiles#destroy
             lessons GET    /lessons(.:format)                               lessons#index
                     POST   /lessons(.:format)                               lessons#create
          new_lesson GET    /lessons/new(.:format)                           lessons#new
         edit_lesson GET    /lessons/:id/edit(.:format)                      lessons#edit
              lesson GET    /lessons/:id(.:format)                           lessons#show
                     PUT    /lessons/:id(.:format)                           lessons#update
                     DELETE /lessons/:id(.:format)                           lessons#destroy
    lesson_revisions GET    /lessons/:lesson_id/revisions(.:format)          revisions#index
                     POST   /lessons/:lesson_id/revisions(.:format)          revisions#create
 new_lesson_revision GET    /lessons/:lesson_id/revisions/new(.:format)      revisions#new
edit_lesson_revision GET    /lessons/:lesson_id/revisions/:id/edit(.:format) revisions#edit
     lesson_revision GET    /lessons/:lesson_id/revisions/:id(.:format)      revisions#show
                     PUT    /lessons/:lesson_id/revisions/:id(.:format)      revisions#update
                     DELETE /lessons/:lesson_id/revisions/:id(.:format)      revisions#destroy
                     GET    /lessons(.:format)                               lessons#index
                     POST   /lessons(.:format)                               lessons#create
                     GET    /lessons/new(.:format)                           lessons#new
                     GET    /lessons/:id/edit(.:format)                      lessons#edit
                     GET    /lessons/:id(.:format)                           lessons#show
                     PUT    /lessons/:id(.:format)                           lessons#update
                     DELETE /lessons/:id(.:format)                           lessons#destroy
                root        /                                                home#index
                            /profile(.:format)                               profiles#show
4

1 に答える 1

1

Your question : 1) Saving the lessons to a user, and revisions to a user and lesson. At one point I had revisions saved to users, but lessons were not saving.

あなたのlessons_form

<%= form_for @lesson, :url => new_lesson_revision_path(@lesson_id, @revision) do |f| %>

アクション フォームを使用していますnew_lesson_revision_path。これは を保存していません。次の@lessonように変更してくださいlessons_form:

<%= form_for @lesson do |f| %>

そして lessons_controller.rb次のようになります:

  def new
    @lesson = Lesson.new
  end

  def create
    @user = current_user
    @lesson = Lesson.new(params[:lesson]) 
    ....
    @lesson.save
    # see, redirect_to new lesson with params[lesson_id]
    redirect_to new_lesson_revision_path(params[:lesson_id])
 end

そしてrevisions_controller.rb次のようになります:

  def new
    @revision = Revision.new
    # get @lesson with params(:lesson_id)
    @lesson = Lesson.find(params[:lesson_id])
  end
  def create
   @revision = @revision.new(params[:revision])
   @revision.user_id = current_user.id
   @revision.time_updated = DateTime.now
     respond_to do |format|
       if @revision.save
         format.html { redirect_to current_user.profile }
         format.json { }
       else
        render :new
        end
      end
  end

で、次のようにrevisions_form追加できますlesson_idhidden_field

<%= form_for(@revision) do |f| %>
  <%= f.hidden_field :lesson_id, :value => @lesson.id %>
  ..
  ..
<% end %>

no 2

ネストされたフォームやマルチステップ フォームを使用しない理由は何ですか?

  • ネストされたフォームを使用している場合は、lessons_form と revisons_form を 1 つのフォームにすることができます。

    ネストされたフォームについては、スクリーンキャストのパート 1パート 2を参照してください

  • マルチステップフォームを使用している場合は、問題を解決できますno 2

    スクリーンキャストを見るウィザード フォーム

追加

error: undefined method 'revisions' for nil:NilClass - from the line @revision = @lesson.revisions.new(params[:revision])

@revisionあなたのケースではスタンドアロンであるため、これを変更できます

@revision = @lesson.revisions.new(params[:revision])

@revision = @revision.new(params[:revision])

于 2013-05-23T06:44:35.630 に答える