Связывая массив строк к “string1, string2 или string3”

Вам не хватает параметра :id в вашем помощнике по маршруту. Вам нужно сделать:

<%= form_for(@room, url: save_details_room_path(id: @room.id)) do |f| %>

И, как предположил Астматик, это должен быть маршрут :post, если на него отправляется форма.

Похоже, вы используете jQuery для заполнения идентификатора комнаты, поэтому вам, возможно, придется пропустить помощника по форме Rails в пользу простой формы HTML. В этом случае вам нужно будет создать и добавить атрибут action после того, как у вас есть номер комнаты.

11
задан Richard Everett 7 April 2009 в 08:19
поделиться

6 ответов

Что относительно:

if (s.Length > 1)
{
    uiText = string.Format("{0} and {1}", string.Join(", ", s, 0, s.Length - 1), s[s.Length - 1]);
}
else
{
    uiText = s.Length > 0 ? s[0] : "";
}
4
ответ дан 3 December 2019 в 02:30
поделиться

Свяжите всех кроме последнего. Сделайте последний вручную.

7
ответ дан 3 December 2019 в 02:30
поделиться

Создайте дополнительный метод на строке [], которые реализуют ту же логику как строка. Соединение, но последний объект будет добавлено с "или".

string[] s = new[] { "Rob", "Jane", "Freddy" };

Console.WriteLine(s.BetterJoin(", ", " or "));

//---8 <----

namespace ExtensionMethods
{
    public static class MyExtensions
    {
        public static string BetterJoin(this string[] items, string separator, string lastSeparator)
        {
            StringBuilder sb = new StringBuilder();

            int length = items.Length - 2;
            int i = 0;

            while (i < length)
            {
                sb.AppendFormat("{0}{1}", items[i++], separator);
            }

            sb.AppendFormat("{0}{1}", items[i++], lastSeparator);
            sb.AppendFormat("{0}", items[i]);

            return sb.ToString();
        }
    }
}
6
ответ дан 3 December 2019 в 02:30
поделиться

Краткое значение ввести? или работать? Самое быстрое для выполнения будет проворачиваться рукой с StringBuilder. Но вводить, вероятно (редактирование обрабатывают 0/1 и т.д.):

string joined;
switch (s.Length) {
    case 0: joined = ""; break;
    case 1: joined = s[0]; break;
    default:
        joined = string.Join(", ", s, 0, s.Length - 1)
               + " or " + s[s.Length - 1];
        break;
} 

StringBuilder подход мог бы посмотреть что-то как:

static string JoinOr(string[] values) {
    switch (values.Length) {
        case 0: return "";
        case 1: return values[0];
    }
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < values.Length - 2; i++) {
        sb.Append(values[i]).Append(", ");
    }
    return sb.Append(values[values.Length-2]).Append(" or ")
        .Append(values[values.Length-1]).ToString();
}
9
ответ дан 3 December 2019 в 02:30
поделиться

Универсальное решение для любого типа T.

static class IEnumerableExtensions
{
  public static string Join<T>(this IEnumerable<T> items,
                               string seperator, string lastSeperator)
  {
    var sep = "";
    return items.Aggregate("", (current, item) =>
      {
        var result = String.Concat(current,
          // not first  OR not last
          current == "" || !items.Last().Equals(item) ? sep : lastSeperator,
          item.ToString());
        sep = seperator;
        return result;
      });
  }
}

Использование:

var three = new string[] { "Rob", "Jane", "Freddy" };
var two = new string[] { "Rob", "Jane" };
var one = new string[] { "Rob" };
var threeResult = three.Join(", ", " or "); // = "Rob, Jane or Freddy"
var twoResult = two.Join(", ", " or "); // = "Rob or Jane"
var oneResult = one.Join(", ", " or "); // = "Rob"
3
ответ дан 3 December 2019 в 02:30
поделиться

Большая часть памяти, эффективной и масштабируемой, использовала бы a StringBuilder и предварительно вычисляя длину заключительной строки для устранения буферных перераспределений. (Это подобно как String.Concat работы метода.)

public static string Join(string[] items, string separator, string lastSeparator) {
    int len = separator.Length * (items.Length - 2) + lastSeparator.Length;
    foreach (string s in items) len += s.Length;
    StringBuilder builder = new StringBuilder(len);
    for (int i = 0; i < items.Length; i++) {
        builder.Append(items[i]);
        switch (items.Length - i) {
            case 1: break;
            case 2: builder.Append(lastSeparator); break;
            default: builder.Append(separator); break;
        }
    }
    return builder.ToString();
}

Использование:

string joined = Join(s, ", ", " or ");

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

public static string Join(string[] items, int index , string separator, string lastSeparator) {
    return items[index++]  + (index == items.Length-1 ? lastSeparator + items[index] : separator + Join(items, index, separator, lastSeparator));
}

Использование:

string joined = Join(s, 0, ", ", " or ");
3
ответ дан 3 December 2019 в 02:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: