2014-10-16 81 views
1

在更新记录时遇到Rails应用程序的问题。每次我做Rails都会创建一条新记录,而不是编辑一个被选中要更新的记录。Rails创建新记录而不是更新

我注意到无论浏览是编辑还是创建,表单都是用Create Flyer按钮呈现的。所以我不确定这个问题是否与Rails有关。

我在这里附上了所有我认为相关的东西。任何其他信息让我知道。

对象本身是传单具有以下值:

ActiveRecord::Schema.define(version: 20141016141700) do 

    create_table "flyers", force: true do |t| 
    t.string "event_name" 
    t.string "location" 
    t.string "genre" 
    t.string "date" 
    t.string "frequency" 
    t.string "tags" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    end 

end 

flyers_controller.rb

class FlyersController < ApplicationController 

    def index 
    @flyers = Flyer.all 
    end 

    def new 
    @flyer = Flyer.new 
    end 

    def create 
    Flyer.create flyer_params 
    redirect_to '/flyers' 
    end 

    def edit 
    find_params 
    end 

    def update 
    find_params 
    @flyer.update flyer_params 
    redirect_to '/flyers' 
    end 

private 

    def flyer_params 
    params[:flyer].permit(:event_name, :location, :genre, :tags, :date, :frequency) 
    end 

    def find_params 
    @flyer = Flyer.find params[:id] 
    end 

end 

两者edit.html.erbnew.html.erb使用以下呈现:

<%= form_for Flyer.new do |f| %> 

    <%= f.label :event_name %> 
    <%= f.text_field :event_name %> 

    <%= f.label :location %> 
    <%= f.text_field :location %> 

    <%= f.label :genre%> 
    <%= f.text_field :genre %> 

    <%= f.label :tags %> 
    <%= f.text_field :tags %> 

    <%= f.label :date %> 
    <%= f.text_field :date %> 

    <%= f.label :frequency %> 
    <%= f.text_field :frequency %> 


    <%= f.submit %> 

<% end %> 

flyers_feature_spec .rb

require 'rails_helper' 

describe 'flyer upload page' do 
    context 'no flyers uploaded' do 
     it 'should display a notification' do 
      visit '/flyers' 
      expect(page).to have_content 'No flyers added' 
     end 
    end 

    context 'adding a flyer' do 
     it 'should be listed on the index' do 
      visit '/flyers' 
      click_link 'Add New Flyer' 
      fill_in 'Event name', with: 'Hospitality' 
      fill_in 'Location', with: 'Brighton' 
      fill_in 'Genre', with: 'Drum and bass, obvs' 
      fill_in 'Tags', with: 'liquid' 
      fill_in 'Date', with: '12/12/14' 
      fill_in 'Frequency', with: 'Weekly' 

      click_button 'Create Flyer' 
      expect(current_path).to eq '/flyers' 
      expect(page). to have_content 'Hospitality' 
     end 
    end 


    context 'with existing flyers' do 

     before do 
      Flyer.create(event_name: 'Hospitality') 
     end 

     describe 'editing a flyer' do 
      it 'should update flyer details' do 
       visit '/flyers' 
       click_link 'Edit' 
       fill_in 'Event name', with: 'Hospitality v2' 
       click_button 'Update' 

       expect(page).to have_content 'Hospitality v2' 
      end 
     end 

    end 
end 
+0

当您在'rails console'中创建调用方法时,您会看到什么? – 2014-10-16 18:36:55

回答

4

添加到edit方法中,所述控制器:

@flyer = Flyer.find(params[:id]) 

而意见的第一行更改为:

<%= form_for @flyer do |f| %> 

P.S.你应该改变edit.html.erb和new.html.erb,所以如果新由于验证失败,它将保留正确填充的字段而不是清空它们。

+0

'edit'方法已经存在于控制器中:)。 – 2014-10-16 19:08:02

+1

正如@makhan指出的那样,你观察这个的原因是因为你在表单中使用了'Flyer.new'。这意味着表单将始终用于Flyer的新实例。用'@ flyer'代替它可以做到这一点,从编辑方法 – 2014-10-16 19:14:31

+0

调用新方法时调用'@flyer = Flyer.new'和'@flyer = Flyer.find(params [:id])'辉煌。就是这样。干杯 – 2014-10-17 07:02:03

相关问题