Rails обновляет один атрибут с несколькими полями - PullRequest
2 голосов
/ 09 августа 2011

В настоящее время я пытаюсь создать форму, называемую countcash, которая позволяет пользователям вводить фактическое количество кварталов, центов, никелей, пенни, двадцатых, десятков, пяти, единиц, а затем денежную стоимость любых других предметов в наличных деньгах.и затем, когда они нажимают «отправить», я хочу суммировать эти значения и установить поле Cashstart моей текущей записи смены.

Реальная проблема заключается в том, что я не уверен, как должна выглядеть моя форма, икак контроллер / модель должны быть настроены в этом случае.

У меня есть shift_id, сохраненный в переменной session[:shift_id], и сдвиг с этим id - это сдвиг, который я хочу изменить с помощью рассчитанного денежного старта.

Что означает <%= form_for %>должен выглядеть тэг, если я хочу правильно следовать MVC и как мне настроить контроллер / модель для обновления базы данных с вычисленным значением?И к чему мне устанавливать маршрут?Я не могу найти ничего подобного ни на переполнении стека, ни на других форумах, посвященных rails (хотя можно подумать, что изменение одного атрибута через несколько текстовых полей было бы довольно просто)

Просто для справки, этоформа, которую я использовал ранее (безрезультатно)

app / views / countcash.html.erb

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

<table>
  <tr>  
    <th>Coins</th>
    <th></th>
  </tr>

  <tr>
    <td>Quarters: </td>
    <td><%= f.text_field :quarters %><br /></td>
  </tr>

  <tr>
    <td>Dimes: </td>
    <td><%= f.text_field :dimes %><br /></td>
  </tr>

  <tr>
    <td>Nickels: </td>
    <td><%= f.text_field :nickels %><br /></td>
  </tr>

  <tr>
    <td>Pennies: </td>
    <td><%= f.text_field :pennies %><br /></td>
  </tr>

  <tr>
    <th>Bills</th>
    <th></th>
  </tr>

  <tr>
    <td>Twenties: </td>
    <td><%= f.text_field :twenties %><br /></td>
  </tr>

  <tr>
    <td>Tens: </td>
    <td><%= f.text_field :tens %><br /></td>
  </tr>

  <tr>
    <td>Fives: </td>
    <td><%= f.text_field :fives %><br /></td>
  </tr>

  <tr>
    <td>Ones: </td>
    <td><%= f.text_field :ones %><br /></td>
  </tr>

  <tr>
    <th>Other</th>
    <th></th>
  </tr>

  <tr>
    <td>Value (in $): </td>
    <td><%= f.text_field :others %><br /></td>
  </tr>


</table>

<div class="actions">
    <%= f.submit %>
</div>
<% end %>

А вот мой shifts_controller, который на данный момент ничего не делает, так какЯ не уверен, как мне нужно обновить атрибут после нажатия кнопки отправки

def countcash
    @shift = Shift.find(session[:shift_id])

    redirect_to(login_path)
end

1 Ответ

5 голосов
/ 09 августа 2011

Я думаю, что вы почти у цели, возможно, у вас есть именованный маршрут, который позволяет вам сделать это как объявление формы:

<%= form_for @shift, :url => countcash_shift_path(@shift) do |f| %>

Если сомневаетесь, запустите в вашей консоли rake route, чтобы определить, так ли этомаршруты существуют.Если это не так, возможно, вы захотите изучить маршруты RESTful, которые должны выглядеть примерно так в вашем маршруте. Rb:

resources :shifts

Внутри действия countcash в вашем контроллере, это просто вопрос выполненияthis:

@shift = Shift.find(session[:id])
@shift.update_attributes(params[:shift]

Это должно работать при условии, что у вас настроены маршруты RESTful для ресурса сдвига.Кроме того, я предполагаю, что ваша модель / база данных настроена на четверти, десять центов и т. Д. В качестве отдельных полей (в противном случае вам потребуются более сложные, чем update_attributes).

Поскольку эти отдельные поля отсутствуют вбазу данных (согласно вашему комментарию), вы не должны помещать как часть формы модели.Таким образом, вместо:

<%= f.text_field :dimes %>

Вы бы сделали что-то вроде:

<%= text_field_tag :dimes, params[:dimes] %>

А внутри вашего контроллера вы можете просто получить к ним доступ так:

params[:dimes] + params[:quarters] # multiply as per currency logic

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

def dimes=(value)
  @running_total += value
end

В вашем контроллере сделайте это вместо:

@shift.attributes = params[:shift]

Итак, когда вы передаете свою модель хешуатрибутов, он попытается назначить значения на основе имен символов.Таким образом, значение dimes в params будет передаваться так, как если бы это вызывалось:

@shift.dimes = params[:shift][:dimes]

Я думаю, что это должно сработать для вас, если вы что-то используете @running_total.Вы можете использовать @amount или что-то еще, если это то, что у вас уже есть в качестве атрибута модели.

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