Ruby on rails 呈现一个';微孔进料&x27;从自定义位置/视图中的Rails教程?
我遵循Michael Hartl的《Rails教程》一书,需要在自定义位置(/members)而不是在站点的根目录下呈现“micropost提要” 我已经更新了SessionController,这样当用户登录时,他们会被重定向到新的/members URL,但是member视图上需要两条语句,它们会导致错误并阻止页面使用micropost提要加载Ruby on rails 呈现一个';微孔进料&x27;从自定义位置/视图中的Rails教程?,ruby-on-rails,routes,custom-routes,Ruby On Rails,Routes,Custom Routes,我遵循Michael Hartl的《Rails教程》一书,需要在自定义位置(/members)而不是在站点的根目录下呈现“micropost提要” 我已经更新了SessionController,这样当用户登录时,他们会被重定向到新的/members URL,但是member视图上需要两条语句,它们会导致错误并阻止页面使用micropost提要加载 # app/views/members/index.html.erb <%= render 'shared/micropost_form' %
# app/views/members/index.html.erb
<%= render 'shared/micropost_form' %>
<%= render 'shared/feed' %>
返回raiseargumenterror,“表单中的第一个参数不能包含nil或为空”,除非object
第二个错误(在删除第一个render语句时看到)返回nil:NilClass的未定义的方法'any'
这个问题的一部分原因是,要在/members
上呈现“micropost提要”app/views/members/index.html.erb
似乎需要访问app/controllers/micropost\u controller.rb
,我不确定如何处理这个问题
更新:
micropost_控制器.rb
# controllers/micropost_controller.rb
class MicropostsController < ApplicationController
before_action :logged_in_user, only: [:create, :destroy]
before_action :correct_user, only: :destroy
def create
@micropost = current_user.microposts.build(micropost_params)
if @micropost.save
flash[:success] = "Micropost created!"
redirect_to '/members'
else
@feed_items = []
render '/members'
end
end
def destroy
@micropost.destroy
flash[:success] = "Micropost deleted"
redirect_to request.referrer || '/members'
end
private
def micropost_params
params.require(:micropost).permit(:content, :picture)
end
def correct_user
@micropost = current_user.microposts.find_by(id: params[:id])
redirect_to '/members' if @micropost.nil?
end
end
#控制器/micropost_controller.rb
类MicropostsController<应用程序控制器
在\u操作之前:登录\u用户,仅:[:创建,:销毁]
行动前:更正用户,仅::销毁
def创建
@micropost=当前用户.micropost.build(micropost参数)
如果@micropost.save
flash[:success]=“创建了Micropost!”
将_重定向到“/members”
其他的
@feed_items=[]
呈现“/成员”
结束
结束
def销毁
@微观破坏
flash[:success]=“已删除Micropost”
将_重定向到request.referer | |“/members”
结束
私有的
def micropost_参数
参数要求(:micropost).允许(:内容,:图片)
结束
def正确的用户
@micropost=当前用户.microposts.find_by(id:params[:id])
如果@micropost.nil,是否将_重定向到“/members”?
结束
结束
_micropost_form.html.erb
# shared/_micropost_form.html.erb
<%= form_for(@micropost, html: { multipart: true }) do |f| %>
<%= render 'shared/error_messages', object: f.object %>
<div class="field">
<%= f.text_area :content, placeholder: "Compose new micropost (420 chars max)..." %>
</div>
<%= f.submit "Post", class: "btn btn-primary" %>
<span class="picture">
<%= f.file_field :picture, accept: 'image/jpeg,image/gif,image/png' %>
</span>
<% end %>
<script type="text/javascript">
$('#micropost_picture').bind('change', function() {
size_in_megabytes = this.files[0].size/1024/1024;
if (size_in_megabytes > 5) {
alert('Maximum file size is 5MB. Please choose a smaller file.');
}
});
</script>
#共享/_microspost_form.html.erb
$('micropost_picture').bind('change',function(){
size_in_MB=this.files[0]。size/1024/1024;
如果(大小(单位:兆字节>5){
警报('最大文件大小为5MB。请选择较小的文件');
}
});
_feed.html.erb
# shared/_feed.html.erb
<% if @feed_items.any? %>
<ol class="microposts">
<%= render @feed_items %>
</ol>
<%= will_paginate @feed_items %>
<% end %>
#共享/_feed.html.erb
MembersController(根据下面@Mandeep的建议更新)
类成员控制器
您没有在部分中传递参数。您需要执行以下操作:
<%= render 'shared/micropost_form', :locals => { :micropost => @micropost } %>
<%= render 'shared/feed', :locals => { :feed_items => @feed_items } %>
{:micropost=>@micropost}%>
{:feed\u items=>@feed\u items}%>
请记住,您需要在索引
方法中包含这两个变量:@micropost
和@feed\u items
将此代码添加到控制器中:
class MembersController < ApplicationController
def index
@micropost = current_user.microposts.build
@feed_items = current_user.microposts
end
end
类成员控制器
您可以发布控制器和部分的代码吗?您的控制器中没有index
方法,您正在渲染其视图吗?第二件事:您为MicropostsController
编写了代码,您希望在app/members/view/index.html.erb
中看到一些内容。要查看成员
,您应该使用成员控制器
。请在控制器中为您发布代码索引
方法。在index
方法中,您应该有@micropost
和@feed\u items
实例变量。我根据要求从MembersController添加了index
方法。它以前是空的,但我早些时候应用了@Mandeep的建议。非常感谢你们两位的帮助!谢谢阿尔斯兰,很高兴知道!不知怎的,我仍然得到了raiseargumenterror,“表单中的第一个参数不能包含nil或为空”,除非object
error来自ArgumentError-in-MembersController#index
。为什么要在MicropstsController
中编写代码,而应该编写一个单独的MembersController
类,并在那里编写与成员相关的代码。很好。谢谢你给阿尔斯兰的信息。我遵循的教程就是这样设计的,如果我弄坏了其他东西,我不想改变它
<%= render 'shared/micropost_form', :locals => { :micropost => @micropost } %>
<%= render 'shared/feed', :locals => { :feed_items => @feed_items } %>
class MembersController < ApplicationController
def index
@micropost = current_user.microposts.build
@feed_items = current_user.microposts
end
end