保存并与Rails的模型和修正模型重定向 [英] Saving and redirecting with a model and revision model in Rails
问题描述
我是比较新的回报率,并一直在一节课内的共享后端。
目前我有两个型号:教训和修订。这个想法是,一个老师会创建一个教训(带有标题,描述等),在课堂/新的一页。该表格会重定向到另一个形式在课堂/ lesson_id /修改/新页面等领域(内容,评论)。最终,老师将能够通过复制修订自己的个人资料保存和修改的经验教训,但该模型还没有。
我仍然关注两个所谓基本问题,无论是在创造新的经验教训和修订。
1)保存的教训给用户,并修订用户和教训。有一次,我不得不保存到用户的版本,但经验教训不节能。
2)从教训形式修订表格和修订版的形式修改页面重定向。我试着在控制器和的form_for块之一改变了重定向,都无济于事。新课形式还是要去/经验教训,而不是/课时/ 1 /修改/新的,而我试图重定向到具有new_lesson_revision_path。修订表单还只是追溯到/修改,这将是一个管理的索引,但我宁愿去/课/ 1 /修改/ 1等。
感谢您事先对这些问题的一方或双方的任何意见!
下面是我的code,以供参考。从routes.rb中的摘录:
资源:经验教训
资源:修订#For索引页管理员
资源:经验教训做
资源:修订
结束
模式
类课程< ActiveRecord的::基地
attr_accessible:稳定:总的来说,:标题:TIME_CREATED
的has_many:修订:CLASS_NAME => 修订版
的has_many:用户:通过=> :修订
结束类修订< ActiveRecord的::基地
attr_accessible:评论,:lesson_id,:USER_ID,:描述:内容:time_updated
belongs_to的:课:CLASS_NAME => 教训,:foreign_key => lesson_id
belongs_to的:用户:CLASS_NAME => 用户,:foreign_key => 用户名 accepts_nested_attributes_for:教训
结束
教训
new.html.erb
<如果user_signed_in%? %GT;
< H2>新建的教训和LT; / H>
<%=的form_for @lesson做| F | %GT;
<%=渲染形式%GT;
<%结束%GT;
<%=的link_to'返回',lessons_path%GT;
<%其他%GT;
< H3>请<%=的link_to'注册',new_user_session_path%GT;或LT;%=的link_to创建帐户,new_user_registration_path%GT;制作和保存的教训与LT; / H3 GT&;
<%结束%GT;
教训
_form.html.erb
<%=的form_for @lesson,:URL => new_lesson_revision_path(@lesson_id,@revision)做| F | %GT; < DIV CLASS =字段>
<%= f.label:标题%GT;< BR />
<%= f.text_field:标题%GT;
< / DIV>
< DIV CLASS =字段>
<%= f.label:总结%GT;< BR />
<%= f.text_area:总结%GT;
< / DIV>
< DIV CLASS =字段>
<%= f.label:稳定%GT;< BR />
<%= f.check_box:稳定%GT;
< / DIV> < DIV CLASS =行动>
&所述;%= f.submit%GT;
< / DIV>
<%结束%GT;
修订
new.html.erb
<如果user_signed_in%? %GT;
< H2>新建修订和LT; / H>
<%=的form_for @revision做| F | %GT;
<%=渲染形式%GT;
<%结束%GT;
<%=的link_to'返回',lessons_path%GT;
<%其他%GT;
< H3>请<%=的link_to'注册',new_user_session_path%GT;或LT;%=的link_to创建帐户,new_user_registration_path%GT;制作并保存修改< / H3 GT&;
<%结束%GT;
修订
_form.html.erb
<%=的form_for(@revision)做| F | %GT; < DIV CLASS =字段>
<%= f.label:描述%GT;< BR />
<%= f.text_field:描述%GT;
< / DIV>
< DIV CLASS =字段>
<%= f.label:含量%GT;< BR />
<%= f.text_area:含量%GT;
< / DIV>
< DIV CLASS =字段>
<%= f.label:发表评论%GT;< BR />
<%= f.text_area:评论%GT;
< / DIV> < DIV CLASS =行动>
&所述;%= f.submit%GT;
< / DIV>
<%结束%GT;
课程控制器:新/创建
高清新
@lesson = Lesson.new
结束 打造高清
@user = CURRENT_USER
@lesson = Lesson.new(PARAMS [:课])
#@user.lessons<< @课
PARAMS [:教训] [:USER_ID] = current_user.id
PARAMS [:教训] [:lesson_id] = @ lesson.id
做的respond_to |格式|
如果@ lesson.save
format.html {redirect_to的new_lesson_revision_path(PARAMS [:lesson_id]),通知:'你的课创建成功。 }
format.json {渲染JSON:@lesson,状态:创建,地点:new_lesson_revision_path}
其他
format.html {渲染动作:新}
format.json {渲染JSON:@ lesson.errors,状态:unprocessable_entity}
结束
结束
结束
修订控制器:新/创建
高清新
@revision = Revision.new
结束
打造高清
@lesson = Lesson.find(PARAMS [:lesson_id])
@revision = @ lesson.revisions.new(PARAMS [:修改])
@ revision.user_id = current_user.id
@ revision.lesson_id = @ lesson.id
@ revision.time_updated = DateTime.now
做的respond_to |格式|
如果@ revision.save
format.html {redirect_to的current_user.profile}
format.json {}
其他
渲染:新
结束
结束
结束
最后这里有大多数的结果从我耙路线:
home_index GET /home/index(.:format)回家#指数
资料发表/profile(.:format)型材#创建
new_profile GET /profile/new(.:format)型材#新
edit_profile GET /profile/edit(.:format)型材#编辑
GET /profile(.:format)型材#秀
PUT /profile(.:format)型材#更新
DELETE /profile(.:format)型材#销毁
教训GET /lessons(.:format)的教训#指数
POST /lessons(.:format)的教训#创建
new_lesson GET /lessons/new(.:format)的教训#新
edit_lesson GET /lessons/:id/edit(.:format)的教训#编辑
教训中获得/lessons/:id(.:format)的教训#秀
PUT /lessons/:id(.:format)的教训#更新
DELETE /lessons/:id(.:format)的教训#销毁
lesson_revisions GET /lessons/:lesson_id/revisions(.:format)修订#指数
POST /lessons/:lesson_id/revisions(.:format)修订#创建
new_lesson_revision GET /lessons/:lesson_id/revisions/new(.:format)修订#新
edit_lesson_revision GET /lessons/:lesson_id/revisions/:id/edit(.:format)修订编辑#
lesson_revision GET /lessons/:lesson_id/revisions/:id(.:format)修订#秀
PUT /lessons/:lesson_id/revisions/:id(.:format)的版本更新#
DELETE /lessons/:lesson_id/revisions/:id(.:format)修订#销毁
GET /lessons(.:format)的教训#指数
POST /lessons(.:format)的教训#创建
GET /lessons/new(.:format)的教训#新
GET /lessons/:id/edit(.:format)的教训#编辑
GET /lessons/:id(.:format)的教训#秀
PUT /lessons/:id(.:format)的教训#更新
DELETE /lessons/:id(.:format)的教训#销毁
根/家居#指数
/profile(.:format)型材#秀
你的问题:1)保存的教训给用户,并修订用户和教训。有一次,我不得不保存到用户的版本,但经验教训不节能。
看到你的 lessons_form
<%=的form_for @lesson,:URL => new_lesson_revision_path(@lesson_id,@revision)做| F | %GT;
您正在使用 new_lesson_revision_path
操作的形式,这不是节约了 @lesson
,修改你的 lessons_form
来:
<%=的form_for @lesson做| F | %GT;
和 lessons_controller.rb
如下:
高清新
@lesson = Lesson.new
结束 打造高清
@user = CURRENT_USER
@lesson = Lesson.new(PARAMS [:课])
....
@ lesson.save
#看看,redirect_to的使用参数新课[lesson_id]
redirect_to的new_lesson_revision_path(PARAMS [:lesson_id])
结束
和 revisions_controller.rb
如下:
高清新
@revision = Revision.new
#得到@lesson使用参数(:lesson_id)
@lesson = Lesson.find(PARAMS [:lesson_id])
结束
打造高清
@revision = @ revision.new(PARAMS [:修改])
@ revision.user_id = current_user.id
@ revision.time_updated = DateTime.now
做的respond_to |格式|
如果@ revision.save
format.html {redirect_to的current_user.profile}
format.json {}
其他
渲染:新
结束
结束
结束
和您的 revisions_form
,你可以添加 lesson_id
与 hidden_field
<%=的form_for(@revision)做| F | %GT;
<%= f.hidden_field:lesson_id,:价值=> @ lesson.id%GT;
..
..
<%结束%GT;
2号
为什么不使用嵌套形式或多步的形式?
Addtional
错误:未定义的方法'修订'的零:NilClass - 从线@revision = @ lesson.revisions.new(PARAMS [:修改])
由于 @revision
是单机上的情况下,可以改变这种
@revision = @ lesson.revisions.new(PARAMS [:修改])
到
@revision = @ revision.new(PARAMS [:修改])
I'm relatively new to RoR, and have been working on a lesson-site sharing back-end.
Currently I have two models: Lesson and Revision. The idea is that a teacher would create a lesson (with a title, description, etc.), at the lesson/new page. The form would redirect to another form with other fields (content, comments) at the lesson/lesson_id/revision/new page. Eventually teachers will be able to "save and modify" lessons by copying revisions to their own profile, but the model isn't there yet.
I'm still focusing on two supposedly basic issues, both in creating new lessons and revisions.
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.
2) Redirecting from the lesson form to the revision form, and the revision form to the revision page. I've tried changing the redirects in the controller and one of the form_for blocks, to no avail. The new lesson form still wants to go to /lessons rather than /lesson/1/revision/new, which I've tried to redirect to with new_lesson_revision_path. The revision form also just goes back to /revisions, which will be an admin index but I'd rather go to /lesson/1/revision/1 etc.
Thanks in advance for any advice on either or both of these issues!
Below is my code for reference. An excerpt from routes.rb:
resources :lessons
resources :revisions #For index pages for admin
resources :lessons do
resources :revisions
end
Models
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
Lessons 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 %>
Lessons _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 %>
Revisions 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 %>
Revisions _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 %>
Lesson Controller: 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
Revisions Controller: 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
Lastly here are most of the results from my rake routes:
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
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.
see on your lessons_form
<%= form_for @lesson, :url => new_lesson_revision_path(@lesson_id, @revision) do |f| %>
You are using new_lesson_revision_path
action form, this is not saving a @lesson
, change your lessons_form
to :
<%= form_for @lesson do |f| %>
and lessons_controller.rb
looks like :
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
and on revisions_controller.rb
looks like :
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
and on your revisions_form
, you can add lesson_id
with hidden_field
<%= form_for(@revision) do |f| %>
<%= f.hidden_field :lesson_id, :value => @lesson.id %>
..
..
<% end %>
no 2
Why should you not use nested form or multistep form?
If you are use nested form, you can make lessons_form and revisons_form in one form.
If you are using multistep form, you can resolved you problem
no 2
see screencasts Wizard Forms
Addtional
error: undefined method 'revisions' for nil:NilClass - from the line @revision = @lesson.revisions.new(params[:revision])
Because @revision
is stand-alone on your case, you could change this
@revision = @lesson.revisions.new(params[:revision])
to
@revision = @revision.new(params[:revision])
这篇关于保存并与Rails的模型和修正模型重定向的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!