Note that there are some explanatory texts on larger screens.

plurals
  1. POHartl Chapter 10 Undefined local variable or method 'object'
    primarykey
    data
    text
    <p>I made the form partial for creating microposts as shown in <a href="http://ruby.railstutorial.org/chapters/user-microposts#code:micropost_form" rel="noreferrer">Listing 10.33</a> with <code>&lt;%= render 'shared/error_messages', object: f.object %&gt;</code> and updated the respective views files as instructed. However, I cannot get the Rspec tests to pass as I keep getting "undefined local variable or method 'object' for Class..." Any ideas?</p> <p>app/views/shared/_micropost_form.html.erb</p> <pre><code>&lt;%= form_for(@micropost) do |f| %&gt; &lt;%= render 'shared/error_messages', object: f.object %&gt; &lt;div class="field"&gt; &lt;%= f.text_area :content, placeholder: "Compose new micropost..." %&gt; &lt;/div&gt; &lt;%= f.submit "Post", class: "btn btn-large btn-primary" %&gt; &lt;% end %&gt; </code></pre> <p>app/views/shared/_error_messages.html.erb</p> <pre><code>&lt;% if object.errors.any? %&gt; &lt;div id="error_explanation"&gt; &lt;div class="alert alert-error"&gt; The form contains &lt;%= pluralize(object.errors.count, "error") %&gt;. &lt;/div&gt; &lt;ul&gt; &lt;% object.errors.full_messages.each do |msg| %&gt; &lt;li&gt;* &lt;%= msg %&gt;&lt;/li&gt; &lt;% end %&gt; &lt;/ul&gt; &lt;/div&gt; &lt;% end %&gt; </code></pre> <p>app/views/users/new.html.erb</p> <pre><code>&lt;% provide(:title, 'Sign up') %&gt; &lt;h1&gt;Sign up&lt;/h1&gt; &lt;div class="row"&gt; &lt;div class="span6 offset3"&gt; &lt;%= form_for(@user) do |f| %&gt; &lt;%= render 'shared/error_messages', object: f.object %&gt; &lt;%= render 'fields', f: f %&gt; &lt;%= f.submit "Create my account", class: "btn btn-large btn-primary" %&gt; &lt;% end %&gt; &lt;/div&gt; &lt;/div&gt; </code></pre> <p>app/views/users/edit.html.erb</p> <pre><code>&lt;% provide(:title, "Edit user") %&gt; &lt;h1&gt;Update your profile&lt;/h1&gt; &lt;div class="row"&gt; &lt;div class="span6 offset3"&gt; &lt;%= form_for(@user) do |f| %&gt; &lt;%= render 'shared/error_messages', object: f.object %&gt; &lt;%= render 'fields', f: f %&gt; &lt;%= f.submit "Save changes", class: "btn btn-large btn-primary" %&gt; &lt;% end %&gt; &lt;%= gravatar_for @user %&gt; &lt;a href="http://gravatar.com/emails" target="_blank"&gt;change&lt;/a&gt; &lt;/div&gt; &lt;/div&gt; </code></pre> <p>Authentication Spec</p> <pre><code>require 'spec_helper' describe "Authentication" do subject { page } describe "signin page" do before { visit signin_path } it { should have_selector('h1', text: 'Sign in') } it { should have_selector('title', text: 'Sign in') } end describe "signin" do before { visit signin_path } describe "with invalid information" do before { click_button "Sign in" } it { should have_selector('title', text: 'Sign in') } it { should have_error_message('Invalid') } it { should_not have_link('Users', href: users_path) } it { should_not have_link('Sign out', href: signout_path) } describe "after visiting another page" do before { click_link "Home" } it { should_not have_selector('div.alert.alert-error') } end end describe "with valid information" do let(:user) { FactoryGirl.create(:user) } before { sign_in user } it { should have_selector('title', text: user.name) } it { should have_link('Users', href: users_path) } it { should have_link('Profile', href: user_path(user)) } it { should have_link('Settings', href: edit_user_path(user)) } it { should have_link('Sign out', href: signout_path) } it { should_not have_link('Sign in', href: signin_path) } describe "followed by signout" do before { click_link "Sign out" } it { should have_link('Sign in') } end end end describe "authorization" do describe "for non-signed-in users" do let(:user) { FactoryGirl.create(:user) } describe "in the Users controller" do it { should_not have_link('Profile', href: user_path(user)) } it { should_not have_link('Settings', href: edit_user_path(user)) } describe "visiting the edit page" do before { visit edit_user_path(user) } it { should have_selector('title', text: 'Sign in') } end describe "submitting to the update action" do before { put user_path(user) } specify { response.should redirect_to(signin_path) } end describe "visiting the user index" do before { visit users_path } it { should have_selector('title', text: 'Sign in') } end end describe "when attempting to visit a protected page" do before do visit edit_user_path(user) fill_in "Email", with: user.email fill_in "Password", with: user.password click_button "Sign in" end describe "after signing in" do it "should render the desired protected page" do page.should have_selector('title', text: 'Edit user') end describe "when signing in again" do before do visit signin_path fill_in "Email", with: user.email fill_in "Password", with: user.password click_button "Sign in" end it "should render the default (profile) page" do page.should have_selector('title', text: user.name) end end end describe "in the Microposts controller" do describe "submitting to the create action" do before { post microposts_path } specify { response.should redirect_to(signin_path) } end describe "submitting to the destroy action" do before { delete micropost_path(FactoryGirl.create(:micropost)) } specify { response.should redirect_to(signin_path) } end end end end describe "as wrong user" do let(:user) { FactoryGirl.create(:user) } let(:wrong_user) { FactoryGirl.create(:user, email: "wrong@example.com") } before { sign_in user } describe "visiting Users#edit page" do before { visit edit_user_path(wrong_user) } it { should_not have_selector('title', text: full_title('Edit user')) } end describe "submitting a PUT request to the Users#update action" do before { put user_path(wrong_user) } specify { response.should redirect_to(root_path) } end end describe "as non-admin user" do let(:user) { FactoryGirl.create(:user) } let(:non_admin) { FactoryGirl.create(:user) } before { sign_in non_admin } describe "submitting a DELETE request to the Users#destroy action" do before { delete user_path(user) } specify { response.should redirect_to(root_path) } end end end end </code></pre> <p>User Spec</p> <pre><code>require 'spec_helper' describe "User pages" do subject { page } describe "index" do let(:user) { FactoryGirl.create(:user) } before(:all) { 30.times { FactoryGirl.create(:user) } } after(:all) { User.delete_all } before(:each) do sign_in user visit users_path end it { should have_selector('title', text: 'All users') } it { should have_selector('h1', text: 'All users') } describe "pagination" do it { should have_selector('div.pagination') } it "should list each user" do User.paginate(page: 1).each do |user| page.should have_selector('li', text: user.name) end end end describe "delete links" do it { should_not have_link('delete') } describe "as an admin user" do let(:admin) { FactoryGirl.create(:admin) } before do sign_in admin visit users_path end it { should have_link('delete', href: user_path(User.first)) } it "should be able to delete another user" do expect { click_link('delete') }.to change(User, :count).by(-1) end it { should_not have_link('delete', href: user_path(admin)) } end end end describe "signup page" do before { visit signup_path } it { should have_selector('h1', text: 'Sign up') } it { should have_selector('title', text: 'Sign up') } end describe "profile page" do let(:user) { FactoryGirl.create(:user) } let!(:m1) { FactoryGirl.create(:micropost, user: user, content: "Foo") } let!(:m2) { FactoryGirl.create(:micropost, user: user, content: "Bar") } before { visit user_path(user) } it { should have_selector('h1', text: user.name) } it { should have_selector('title', text: user.name) } end describe "microposts" do it { should have_content(m1.content) } it { should have_content(m2.content) } it { should have_content(user.microposts.count) } end describe "signup" do before { visit signup_path } let(:submit) { "Create my account" } describe "with invalid information" do it "should not create a user" do expect { click_button submit }.not_to change(User, :count) end describe "after submission" do before { click_button submit } it { should have_selector('title', text: 'Sign up') } it { should have_content('error') } end end describe "with valid information" do before { valid_signup } it "should create a user" do expect { click_button submit }.to change(User, :count).by(1) end describe "after saving the user" do before { click_button submit } let(:user) { User.find_by_email('user@example.com') } it { should have_selector('title', text: user.name) } it { should have_success_message('Welcome') } it { should have_link('Sign out') } end end end describe "edit" do let(:user) { FactoryGirl.create(:user) } before do sign_in user visit edit_user_path(user) end describe "page" do it { should have_selector('h1', text: "Update your profile") } it { should have_selector('title', text: "Edit user") } it { should have_link('change', href: 'http://gravatar.com/emails') } end describe "with invalid information" do before { click_button "Save changes" } it { should have_content('error') } end describe "with valid information" do let(:new_name) { "New Name" } let(:new_email) { "new@example.com" } before do fill_in "Name", with: new_name fill_in "Email", with: new_email fill_in "Password", with: user.password fill_in "Confirm Password", with: user.password click_button "Save changes" end it { should have_selector('title', text: new_name) } it { should have_success_message } it { should have_link('Sign out', href: signout_path) } specify { user.reload.name.should == new_name } specify { user.reload.email.should == new_email } end end end </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload