Ruby on rails 呈现一个';微孔进料&x27;从自定义位置/视图中的Rails教程?

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' %

我遵循Michael Hartl的《Rails教程》一书,需要在自定义位置(/members)而不是在站点的根目录下呈现“micropost提要”

我已经更新了SessionController,这样当用户登录时,他们会被重定向到新的/members URL,但是member视图上需要两条语句,它们会导致错误并阻止页面使用micropost提要加载

# 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