Проблема проверки рельсов - PullRequest
       15

Проблема проверки рельсов

1 голос
/ 08 октября 2009

ОК, так что я действительно новичок в Ruby on Rails. Я использую InstantRails, если это что-то изменит.

Вот моя проблема - я пытаюсь проверить некоторые записи в форме. Если я использую форму без каких-либо проверок, то она работает нормально. Если я добавлю проверки, это полностью изменит поведение приложения и не будет работать.

Например, если я ввожу данные (без проверок), кнопка формы отправляет данные, используя метод create, который перенаправляет пользователя обратно в индекс. (где форма) Список всего, что было введено в форму в какой-то момент или еще раз, также находится в индексе, поэтому пользователь может видеть, что его самая последняя отправка была добавлена. (на странице также есть флеш-сообщение после отправки)

НО, если я делаю то же самое, у меня есть только некомментированные проверки в модели, ничего не сохраняется в базе данных, и вместо перенаправления на индекс Rails пытается перенаправить использование на страницу создания, которая не есть.

Ниже размещены соответствующие части моего контроллера, модели и вида, а также журналы Rails для 2 сценариев.

Контроллер

def index
    @page_subtitle = "Manage Members"
    @contacts      = Directory.find(:all)
end

def edit
    @page_subtitle = "Edit entries"
end

def create
    @contact       = Directory.new(params[:contact])
    if @contact.save
        flash[:notice] = 'Contact was successfully added.'
        redirect_to :action => "index"
    end
end

Модель

class Directory < ActiveRecord::Base
validates_presence_of :fname, :lname, :number
validates_numericality_of :number
validates_uniqueness_of :number
validates_length_of :number, :within => 7..10, :message => "Please enter a telephone number that is 7 to 10 digits long. If you require a longer number, please contact support."
end

вид

<b>Add a new member:</b>
<hr>
<% form_for :contact, :url => { :action => "create" } do |f| %>
<table>
<tr>
    <td><%= f.text_field :fname %></td>
    <td><%= f.text_field :lname %></td>
    <td><%= f.text_field :number %></td>
</tr>
<tr height="5px">
</tr>
<tr>
    <td><%= f.submit "Add Member" %></td>
</tr>
     </table>
     <% end %>
     <br>
     <b>Members currently in database:</b>
     <hr>
     <table width="100%">
         <% for contact in @contacts %>
         <tr>
             <td><%=h contact.fname %></td>
             <td><%=h contact.lname %></td>
             <td><%=h contact.number %></td>
         </tr>
         <% end %>
     </table>
<br>

Журнал (пустая модель, рабочее приложение)

Processing DirectoriesController#create (for 127.0.0.1 at 2009-10-07 23:11:01) [POST]
Session ID: BAh7BzoMY3NyZl9pZCIlODkwZWVmNzgxYzdlZmUxYjdiNWRjNjZiMWYxNGMw%0AMDkiCmZsYXNoSUM6J0FjdGlvbkNvbnRyb2xsZXI6OkZsYXNoOjpGbGFzaEhh%0Ac2h7AAY6CkB1c2VkewA%3D--043c05ff742c224f3bbc27db8bd8330b0b962740
Parameters: {"commit"=>"Add Member", "contact"=>  {"number"=>"9882345688", "lname"=>"Person", "fname"=>"Unique"}, "authenticity_token"=>"467d6a642f0171a166ee093ec05bdef86ba009ac", "action"=>"create", "controller"=>"directories"}
[4;36;1mDirectory Columns (0.003000)[0m   [0;1mSHOW FIELDS FROM `directories`[0m
[4;35;1mSQL (0.000000)[0m   [0mBEGIN[0m
[4;36;1mDirectory Create (0.001000)[0m   [0;1mINSERT INTO `directories`   (`updated_at`, `number`, `lname`, `fname`, `created_at`) VALUES('2009-10-07 23:11:01', '9882345688', 'Person', 'Unique', '2009-10-07 23:11:01')[0m
[4;35;1mSQL (0.034000)[0m   [0mCOMMIT[0m
Redirected to http://127.0.0.1:3000/directories
Completed in 0.05100 (19 reqs/sec) | DB: 0.03800 (74%) | 302 Found    [http://127.0.0.1/directories/create]

Журнал (проверки в модели, неработающее приложение)

Processing DirectoriesController#create (for 127.0.0.1 at 2009-10-07 23:08:29) [POST]
Session ID: BAh7BzoMY3NyZl9pZCIlODkwZWVmNzgxYzdlZmUxYjdiNWRjNjZiMWYxNGMw%0AMDkiCmZsYXNoSUM6J0FjdGlvbkNvbnRyb2xsZXI6OkZsYXNoOjpGbGFzaEhh%0Ac2h7AAY6CkB1c2VkewA%3D--043c05ff742c224f3bbc27db8bd8330b0b962740
Parameters: {"commit"=>"Add Member", "contact"=>{"number"=>"8641234567", "lname"=>"Timms", "fname"=>"John"}, "authenticity_token"=>"467d6a642f0171a166ee093ec05bdef86ba009ac", "action"=>"create", "controller"=>"directories"}
[4;36;1mDirectory Columns (0.003000)[0m   [0;1mSHOW FIELDS FROM `directories`[0m
[4;35;1mSQL (0.001000)[0m   [0mBEGIN[0m
[4;36;1mDirectory Load (0.001000)[0m   [0;1mSELECT * FROM `directories` WHERE (directories.number = '8641234567') LIMIT 1[0m
[4;35;1mSQL (0.000000)[0m   [0mCOMMIT[0m
Rendering template within layouts/application
Rendering directories/create
Completed in 0.02000 (50 reqs/sec) | Rendering: 0.00400 (20%) | DB: 0.00500 (25%) | 200 OK [http://127.0.0.1/directories/create]

Спасибо за любую помощь, которую вы можете оказать!

Ответы [ 2 ]

1 голос
/ 08 октября 2009

@contact.save возвращает false, потому что проверки не пройдены. Ваше действие create прямо не говорит, что визуализировать в этом случае, поэтому Rails пытается отобразить то, что вам нужно, а именно шаблон с именем вашего действия: create.html.erb.

Обычная вещь, которую нужно сделать, это перерисовать новый шаблон, чтобы пользователь мог решить проблемы.

def create
  @contact = Directory.new(params[:contact])
  if @contact.save
    flash[:notice] = 'Contact was successfully added.'
    redirect_to :action => "index"
  else
    # validation failed, so give the user a chance to fix it
    render :action => "new"
  end
end
0 голосов
/ 08 октября 2009

Я могу догадаться, что validates_uniqueness_of не удастся, что означает, что @contact.save возвращает false, и, поскольку вы не сказали Rails, какой шаблон использовать в этом случае, он использует шаблон по умолчанию, имя которого совпадает с именем действия. 1003 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...