我对RoR比较陌生,并且一直致力于分享后端的课程。
目前我有两种模式:课程和修订版。这个想法是教师会在课程/新页面上创建一个课程(带有标题,描述等)。该表单将在课程/ lesson_id / revision / new页面中重定向到包含其他字段(内容,注释)的另一个表单。最终,教师可以通过将修订复制到他们自己的个人资料来“保存和修改”课程,但该模型还没有。
我仍然专注于两个所谓的基本问题,无论是创造新课程还是修订。
1)将课程保存给用户,并修改用户和课程。有一次,我对用户进行了修改,但课程没有保存。
2)从课程表单重定向到修订表单,将修订表单重定向到修订页面。我已经尝试更改控制器中的重定向和form_for块中的一个,但无济于事。新课程表仍然希望转到/课程而不是/ lesson / 1 / revision / new,我尝试使用new_lesson_revision_path重定向到。修订表格也只是回到/修订版,这将是一个管理员索引,但我宁愿去/ 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 %>
课程控制器:new / create
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
修订控制器:new / create
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
答案 0 :(得分: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_id
添加hidden_field
<%= form_for(@revision) do |f| %>
<%= f.hidden_field :lesson_id, :value => @lesson.id %>
..
..
<% end %>
no 2
为什么不使用嵌套表单或多步表单?
如果您使用的是嵌套表单,则可以使用lesson_form和 revisons_form以一种形式。
如果您使用的是多步表单,则可以解决问题no 2
参见截屏广告Wizard Forms
<强> Addtional 强>
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])