使用Rails在表单提交期间为后台属性分配值

时间:2012-06-22 19:53:03

标签: ruby-on-rails ruby forms model-view-controller

我在页面上有一个表单,用户可以使用该表单来创建课程。虽然我了解如何为用户提供填写课程名称和描述等简单内容的机会,但我还想将用户的ID分配给teacher_id列。这应该为用户自动完成,他们不应该看到分配teacher_id的机会,因为它应该是他们的id。

目前,“创建课程”页面的视图是:

<% provide(:title, 'My Classes') %>
<h1>Create a class!</h1>

<div class="row">
   <div class="span6 offset3">
     <%= form_for(@course) do |f| %>

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

      <%= f.label :description %>
      <%= f.text_area :description, :size => "30x6" %>

      <!-- Assign the current user's id to the teacher_id column in the background -->

      <%= f.submit "Create my account", class: "btn btn-large btn-primary" %>
     <% end %>
  </div>
</div>

课程控制器中的新动作如下:

def new
    @course = Course.new
end

完成我想做的最好的方法是什么?我是Rails的新手,我对表格和所有可能性都没有多少经验。我在hidden_​​field_tag上阅读了一些内容,但我不知道这是否是我需要的东西,而且我发现很难在表单中获取用户的id。我是否需要在控制器中创建用户实例变量,或者我可以在视图中以某种方式使用代码。

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

您可能会有以下创建操作:

def create
  @course = Course.new(params[:course])
end

假设您有@current_user的变量可用,您应该可以在保存新课程之前在控制器中设置该变量。

def create
  @course = Course.new(params[:course])
  @course.teacher_id = @current_user.id
  @course.save
  redirect_to :action => "show", :id => @course.id
end

答案 1 :(得分:1)

您可以使用hidden_field

<% provide(:title, 'My Classes') %>
 <h1>Create a class!</h1>

<div class="row">
   <div class="span6 offset3">
     <%= form_for(@course) do |f| %>

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

      <%= f.label :description %>
      <%= f.text_area :description, :size => "30x6" %>

      <%= f.hidden_field :teacher_id, :value => :current_user.id %>

      <%= f.submit "Create my account", class: "btn btn-large btn-primary" %>
     <% end %>
  </div>
</div>

编辑 - 解释如何在表单中提供current_user

我通常有一个session控制器负责登录和注销用户,创建session以保持用户登录。

创建操作例如:

  def create
    user = User.find_by_name(params[:name])
    if user && user.authenticate(params[:password])
      session[:user_id] = user.id
      flash[:success] = "Welcome " + current_user.name
      redirect_to user
    else
      flash.now[:error] = "Invalid username/password combination."
      render "new"
    end
  end

如果用户名和密码的组合正确,则会使用sessionuser_id)创建session[:user_id]。 现在,在您的application_controller中,您可以使用以下内容:

private
def current_user
  @current_user ||= User.find(session[:user_id]) if session[:user_id]
end
helper_method :current_user

helper_method允许您在应用程序的任何控制器或视图中使用current_user

我希望它有所帮助....