【问题标题】:Rails - Problem in Creating ModelRails - 创建模型时出现问题
【发布时间】:2011-05-23 04:50:29
【问题描述】:

我正在使用属于其他 2 个模型的模型。当我尝试创建它时,我设法获取了两个 id,但内容本身并未​​存储在数据库中

 def create
    @person = Person.find(current_person)
    @message = Message.create(:group => Group.find(params[:group_id]), :person => Person.find(current_person))
    if @message.save
      redirect_to(:back)
    else
      redirect_to(:back)
    end
  end



<% form_for(:message, :url => messages_path(:person_id => current_person.id, :group_id => @group.id)) do |f| %>
<%= f.text_area :content %> 
<%= f.submit "Submit" %>
<%end %>

另外,content 在数据库中设置为文本,我使用的是 PostgreSQL。

【问题讨论】:

  • 当你在模型上调用create 方法时,它会保存到数据库中。可能,您需要调用new 来初始化新实例。或者,如果您喜欢 create 方法 - 使用 new_record? 查看它是否保存了某个实例(由于验证失败或类似情况)。

标签: ruby-on-rails ruby-on-rails-3 forms controller


【解决方案1】:
@message = Message.create params[:message].merge(:group => Group.find(params[:group_id]), :person => Person.find(current_person))

【讨论】:

    【解决方案2】:

    @why 上面的答案应该为您解决。但你可以更上一层楼,利用联想的力量。

    在你的 message.rb 中,你会有关联

    class Message < ActiveRecord::Base
      ..
      belongs_to :group
      belongs_to :person
      ...
    end
    

    您也可以在声明 has_many 关系的 Group / Person 模型中拥有类似的关联。

     class Group < ActiveRecord::Base
       ...
       has_many :messages
       ...
     end
    
     class Person < ActiveRecord::Base
       ...
       has_many :messages
       ...
     end
    

    routes.rb(Rails 2.3.x)中

     map.resources :group, :has_many => [:messages]
    

    routes.rb(Rails 3)中

     resources :groups do
       resources :messages
     end
    

    这将为您提供类似

    的路线
    POST group_messages_path(:group_id) # => this will route to 
                                        # MessagesController's create action
                                        # and provide params[:group_id]
    

    您正在使用似乎与当前登录相关的 current_person,因此通过 url 或参数使其可见或可编辑不是一个好主意。 current_person 应该派生自创建操作本身的会话。

    # form_for([@group,:message]) or form_for([@group,@message])
    # automatically works out the path as POST /groups/:group_id/messages => MessagesController#create
    # And current person association remains safe to currently logged in person
    # without being revealed thru parameters and such.
    
    <% form_for([@group,@message]) do |f| %>
      <%= f.text_area :content %> 
      <%= f.submit "Submit" %>
    <% end %>
    
    
    def create
      @group = Group.find(params[:group_id])
      @person = current_person # or however you find current_person
      @message = @group.messages.build(params[:messaage])
      @message.person = @person
      if @message.save
        redirect_to(:back)
      else
        redirect_to(:back)
      end
    end
    

    【讨论】:

      【解决方案3】:

      尝试改变

       @message = Message.create(:group => Group.find(params[:group_id]), :person => Person.find(current_person))
      

      @message = Message.create(:group =&gt; Group.find(params[:group_id]), :person =&gt; Person.find(current_person), :content =&gt; params[:content])

      【讨论】:

        猜你喜欢
        • 2019-03-24
        • 2019-11-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-06
        • 1970-01-01
        • 2016-01-04
        • 2022-01-26
        相关资源
        最近更新 更多