форма_для отправки не всех полей - PullRequest
0 голосов
/ 19 декабря 2010

Используйте скрытое поле, чтобы исправить мою проблему ... я понял ..

Привет всем,

Я новичок в рельсах, пытаюсь немного попрактиковаться. Приложение, которое я пишу, пытается создать новую «публикацию». См. Представление и контроллер ниже.

Но это не работает так, как я ожидал ... параметры передаются в функцию «сохранить», поля «post_at» нет ...

Как я могу это исправить ??? Спасибо

INFO:   Parameters: {"authenticity_token"=>"Xc9VuvRL6GsUTaKyyNQxp8ovylEYwOMC+7hMcqdKizg=", "post"=>{"title"=>"First post", "content"=>"Write something"}, "commit"=>"save"}

Просмотр new_post.erb

<div class="post">
  <% form_for @new_post, :url => { :action => "save" } do |f| %>
    <p><%= f.error_messages %></p>
    <br/>
    <table>
      <tr>
        <td>Title</td>
        <td><%= f.text_field :title %></td>
      </tr>
      <tr>
        <td>Post at</td>
        <td><%= @new_post.post_at %></td>
      </tr>
      <tr>
        <td>Message</td>
        <td><%= f.text_area :content, :cols => 100, :rows => 10 %></td>
      </tr>
    </table>
    <br/>
    <%= f.submit 'save'%>
  <% end %>
</div>

Post Controler

class PostController < ApplicationController
  def index
    @all_posts = Post.find(:all)

    render :action => "post"
  end

  def new
    @new_post = Post.new
    @new_post.post_at = Time.now

    render :action => "new_post"
  end

  def save
    @new_post = params[:post]
    Post.create(@new_post)

    redirect_to "/post"
  end
end

Модель данных:

class Post
  include DataMapper::Resource
  storage_names[:default] = "Post"

  property :id,      Serial
  timestamps :at

  property :title,        String,        :required => true, :length => 500
  property :content,      Text,          :required => true, :lazy => false
  property :post_at,      DateTime
end

Ответы [ 3 ]

1 голос
/ 19 декабря 2010

Ваше значение post_at не является полем, оно просто отображается в таблице. Вы хотите сделать это:

<tr>
  <td>Post at</td>
  <td><%= f.datetime_select :post_at %></td>
</tr>

Но на самом деле, в этом коде больше неправильного. Для начала, в Rails уже есть поле для этого, которое будет установлено автоматически и называется created_at. Далее, ваше действие save в вашем контроллере должно быть действием create в соответствии с соглашениями Rails.

Я действительно думаю, что вам следует прочитать руководство Getting Started , которое охватывает эти основные основы, а затем книгу или две о Rails более подробно. Они действительно многому вас научат.

1 голос
/ 19 декабря 2010

Во-первых, ваша разработка будет намного проще, если вы будете следовать REST-принципам .

Ваш контроллер должен вместо save реализовать методы create и update.


def index
  @posts = Post.all
end

def new
  @post = Post.new
end

def create
  @post = Post.create(params[:post])
  redirect_to @post
end

def show
  @post = Post.get(params[:id])
end

def edit
  @post = Post.get(params[:id])
end

def update
  @post = Post.get(params[:id])
  @post.update_attributes(params[:post])
  redirect_to @post
end

def destroy
  @post = Post.get(params[:id])
  @post.destroy
  redirect_to posts_path
end

Это полный REST-контроллер с представлениями index.html.erb, new.html.erb, edit.html.erb, show.html.erb все в app/views/posts.

Sidenote: Если вы новичок в Rails, это может быть хорошимИдея узнать, как использовать его с ActiveRecord, прежде чем пытаться на DataMapper.Таким образом, вы можете использовать rails generate scaffold, чтобы получить полный пример того, как сделать все это.

0 голосов
/ 19 декабря 2010

Райан прав в отношении причины проблемы.

Если вам нужно поле только для чтения, вы можете добавить скрытое поле, чтобы убедиться, что значение отправлено обратно:

    <td><%= @new_post.post_at %><%= f.hidden_field :post_at %></td>

или вы можете полностью заменить его текстовым полем только для чтения:

    <td><%= f.text_field :post_at, :readonly => true %></td>
...