routes - Render a 'micropost feed' from the Rails Tutorial in a custom location/view? -
i followed michael hartl's 'rails tutorial' book , need render 'micropost feed' @ custom location (/members) instead of @ site's root.
i've updated sessionscontroller when user logs in redirected new /members url, there 2 statements needed on member view cause errors , prevent page loading micropost feed.
# app/views/members/index.html.erb <%= render 'shared/micropost_form' %> <%= render 'shared/feed' %> the first error is:
argumenterror in memberscontroller#index first argument in form cannot contain nil or empty returning raise argumenterror, "first argument in form cannot contain nil or empty" unless object , second error (seen when removing first render statement) returns undefined method 'any?' nil:nilclass
part of issue because render 'micropost feed' @ /members app/views/members/index.html.erb seems need access app/controllers/microposts_controller.rb , i'm unsure how handle this.
update:
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 }) |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 5mb. please choose 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 (as updated @mandeep's suggestion below)
class memberscontroller < applicationcontroller def index @micropost = current_user.microposts.build @feed_items = current_user.microposts end end
you not passing arguments in partials. need following:
<%= render 'shared/micropost_form', :locals => { :micropost => @micropost } %> <%= render 'shared/feed', :locals => { :feed_items => @feed_items } %> remember, need have these 2 variables inside index method: @micropost , @feed_items.
Comments
Post a Comment