繁体   English   中英

在自定义位置/视图中从Rails教程渲染“微博输入”?

[英]Render a 'micropost feed' from the Rails Tutorial in a custom location/view?

我按照Michael Hartl的“Rails教程”一书,需要在自定义位置(/成员)而不是站点的根目录中呈现“微博提要”。

我已更新SessionsController,以便在用户登录时将其重定向到新的/成员URL,但成员视图上需要两个语句,这些语句会导致错误并阻止页面加载微博提要。

# app/views/members/index.html.erb
<%= render 'shared/micropost_form' %>
<%= render 'shared/feed' %>

第一个错误是:

ArgumentError in MembersController#index
First argument in form cannot contain nil or be empty

返回raise ArgumentError, "First argument in form cannot contain nil or be empty" unless object和第二个错误(在删除第一个render语句时看到)返回undefined method 'any?' for nil:NilClass undefined method 'any?' for nil:NilClass

这个问题的部分原因是因为在/members app/views/members/index.html.erb上呈现'micropost feed'似乎需要访问app/controllers/microposts_controller.rb ,我不确定如何处理这个问题。

更新:

micropost_controller.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_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>

_feed.html.erb

# shared/_feed.html.erb

<% if @feed_items.any? %>
  <ol class="microposts">
    <%= render @feed_items %>
  </ol>
  <%= will_paginate @feed_items %>
<% end %>

MembersController(更新@Mandeep的建议如下)

class MembersController < ApplicationController
  def index
    @micropost = current_user.microposts.build
    @feed_items = current_user.microposts
  end
end

你没有在你的部分中传递参数。 您需要执行以下操作:

<%= render 'shared/micropost_form', :locals => { :micropost => @micropost }  %>
<%= render 'shared/feed', :locals => { :feed_items => @feed_items }  %>

请记住,您需要在index方法中包含这两个变量: @micropost@feed_items

将此代码添加到Controller:

class MembersController < ApplicationController
  def index
    @micropost = current_user.microposts.build
    @feed_items = current_user.microposts
  end
end

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM